http://poj.org/problem?id=3070
直接用矩阵快速幂得到f(n)
然后输出后四位即可。
1 #include <cstdio> 2 typedef long long ll; 3 const int mod = 10000; 4 struct Mat 5 { 6 ll matrix[2][2]; 7 }; 8 9 Mat mul(Mat a,Mat b) 10 { 11 Mat c; 12 for(int i=0;i<2;i++) 13 for(int j=0;j<2;j++) 14 { 15 c.matrix[i][j]=0; 16 for(int k=0;k<2;k++) 17 { 18 c.matrix[i][j]+=(a.matrix[i][k]*b.matrix[k][j])%mod; 19 } 20 c.matrix[i][j]%=mod; 21 } 22 return c; 23 } 24 Mat mat; 25 Mat solve(ll m) 26 { 27 Mat mt=mat; 28 m--; 29 while(m) 30 { 31 if(m&1) 32 { 33 mt=mul(mat,mt); 34 m--; 35 } 36 mat=mul(mat,mat); 37 m/=2; 38 } 39 return mt; 40 } 41 int main() 42 { 43 //freopen("a.txt","r",stdin); 44 ll n; 45 while(~scanf("%lld",&n)&&n!=-1) 46 { 47 if(n==0) {printf("0\n");continue;} 48 if(n==1) {printf("1\n");continue;} 49 mat.matrix[0][0]=mat.matrix[0][1]=mat.matrix[1][0]=1; 50 mat.matrix[1][1]=0; 51 Mat c=solve(n-1); 52 printf("%lld\n",c.matrix[0][0]%10000); 53 } 54 return 0; 55 }
原文:http://www.cnblogs.com/nowandforever/p/4675401.html