C++-POJ3070-Fibonacci-[矩阵乘法][快速幂]

 1 #include <cstdio>
 2 struct Matrix{int a[5][5];};
 3 const int N=2,MOD=1e4;
 4 Matrix A,B,O,I;
 5 Matrix Mul(Matrix A,Matrix B){
 6     Matrix C=O;
 7     for(int i=1;i<=N;i++)
 8         for(int j=1;j<=N;j++)
 9             for(int k=1;k<=N;k++)
10                 C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%MOD;
11     return C;
12 }
13 Matrix Pow(Matrix A,int n){
14     Matrix B=I;
15     for(;n;n>>=1,A=Mul(A,A))if(n&1)B=Mul(B,A);
16     return B;
17 }
18 int main(){
19     for(int i=1;i<=2;i++)for(int j=1;j<=2;j++)O.a[i][j]=0,I.a[i][j]=(i==j);
20     A.a[1][1]=0,A.a[1][2]=1;
21     A.a[2][1]=1,A.a[2][2]=1;
22     int n;
23     while(scanf("%d",&n)){
24         if(n==-1)break;
25         B=Pow(A,n+1),printf("%d\n",B.a[1][1]);
26     } 
27     return 0;
28 } 

猜你喜欢

转载自www.cnblogs.com/JasonCow/p/12363510.html