标签:
Description
Input
Sample Input
Sample Output
#include <iostream> #include <cstdio> #include <cmath> using namespace std; typedef struct { long long m[2][2]; }mat; mat p={0,1,1,1},I={1,0,0,1}; mat calc(mat a,mat b) { int i,j,k; mat c; for(i=0;i<2;i++) for(j=0;j<2;j++) { c.m[i][j]=0; for(k=0;k<2;k++) { c.m[i][j]+=a.m[i][k]*b.m[k][j]%10000; } c.m[i][j]%=10000; } return c; } mat matirx(int n) { mat m=p,b=I; while(n>=1) { if(n&1) b=calc(b,m); n>>=1; m=calc(m,m); } return b; } int main() { int i,a[42],len; int n; double s,d; a[0]=0; a[1]=1; for(i=2; i<40; i++) a[i]=a[i-1]+a[i-2]; while(scanf("%d",&n)!=EOF) { if(n<40) printf("%d\n",a[n]); else { s=log10(1.0/sqrt(5))+n*log10((1+sqrt(5))/2.0);//fibonacci封闭公式求前四位 len=(int)s; d=s+3-len; printf("%d...",(int)pow(10,d)); mat tmp; tmp=matirx(n); //矩阵连乘求后四位 printf("%04d\n",tmp.m[0][1]); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/4734709.html