NYOJ 148 fibonacci数列(二)
地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=148
1 #include<stdio.h> 2 void fun(int a1[][2],int a2[][2]) 3 { 4 int c[2][2],i,j,k; 5 for(i=0;i<2;i++) 6 for(j=0;j<2;j++) 7 { 8 c[i][j]=0; 9 for(k=0;k<2;k++) 10 c[i][j]=(c[i][j]+a1[i][k]*a2[k][j])%10000; 11 } 12 for(i=0;i<2;i++) 13 for(j=0;j<2;j++) 14 a1[i][j]=c[i][j]; 15 } 16 int main() 17 { 18 int n; 19 while(~scanf("%d",&n)) 20 { 21 int a[2][2]={{1,1},{1,0}}; 22 int b[2][2]={{1,0},{0,1}}; //初始化为单位矩阵,保存fib的值 23 if(n==-1) break; 24 while(n) 25 { 26 if(n&1) 27 fun(b,a); 28 fun(a,a); 29 n>>=1; 30 } 31 printf("%d\n",b[1][0]); //最后n必然从1变为0,所以最后一次总要执行 fun(b, a); 32 } 33 }