poj 3070 Fibonacci

来源:互联网 发布:西游记知大圣归来 编辑:程序博客网 时间:2024/05/21 06:35

有个递推方程自己构造 矩阵就可以了。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int dp[2]={1,0};const int mod=10000;struct matrix{int f[2][2];};matrix mul(matrix a,matrix b){int i,j,k;matrix s;memset(s.f,0,sizeof(s.f));for(i=0;i<2;i++)for(j=0;j<2;j++)for(k=0;k<2;k++)s.f[i][j]=(s.f[i][j]+a.f[i][k]*b.f[k][j])%mod;return s;}void quick_pow(matrix a,int k){matrix s;int i;memset(s.f,0,sizeof(s.f));for(i=0;i<2;i++) s.f[i][i]=1;while(k){if(k&1) s=mul(s,a);a=mul(a,a);k=k>>1;}printf("%d\n",s.f[0][0]);}int main(){int n;while(scanf("%d",&n),n!=-1){matrix s;s.f[0][0]=1;s.f[0][1]=1;s.f[1][0]=1;s.f[1][1]=0;if(n==0) {printf("0\n");continue;}quick_pow(s,n-1);}}