poj 3070 Fibonacci 矩阵快速幂

来源:互联网 发布:知有儿童挑促织 编辑:程序博客网 时间:2024/06/05 12:42
#include <cstdio>#include <cstring>using namespace std;#define M_H 2#define M_L 2typedef struct ma{    int h, l;    int a[M_H][M_L];}ma;ma need, anser;void init(){    need.h=2;   need.l=2;    anser.h=2;  anser.l=2;    need.a[0][0]=1; anser.a[0][0]=1;    need.a[0][1]=1; anser.a[0][1]=0;    need.a[1][0]=1; anser.a[1][0]=0;    need.a[1][1]=0; anser.a[1][1]=1;}ma multi(ma a, ma b){    ma c;    c.h=a.h;  c.l=b.l;    for(int i=0; i<c.h; i++) for(int j=0; j<c.l; j++) c.a[i][j]=0;    for(int i=0; i<c.h; i++){        for(int j=0; j<c.l; j++){            int ans=0;            for(int k=0; k<a.h; k++){                ans += (a.a[i][k] * b.a[k][j])%10000;            }            c.a[i][j]=ans%10000;        }    }    return c;}int main(){    int m;    while( scanf("%d", &m) != -1 ){        if(m==-1) break;        init();        while(m>0){            if(m&1){                anser = multi(anser, need);            }            need = multi(need, need);            m = m>>1;        }        printf("%d\n", anser.a[0][1]%10000);    }    return 0;}

0 0