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 }

posted on 2012-11-24 20:36  mycapple  阅读(317)  评论(0编辑  收藏  举报

导航