标签:
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3141 Accepted Submission(s): 1431
//矩阵快速幂解递推式:f(n)=f(n-1)+f(n-2)+f(n-3) #include<cstdio> #include<cstring> using namespace std; struct node{ int mat[4][4]; }; int L,M; const int n=4; node mat_multi(node a,node b) { node c; int i,j,k; memset(c.mat,0,sizeof(c.mat)); for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; c.mat[i][j]%=M; } return c; } node pow_mod(node a,int t) { node c; int i; memset(c.mat,0,sizeof(c.mat)); for(i=0;i<n;i++) c.mat[i][i]=1; for(;t>0;t>>=1) { if(t&1) c=mat_multi(a,c); a=mat_multi(a,a); } return c; } int main() { int i,t; int b[4]={9,6,4,2}; node c; while(~scanf("%d%d",&L,&M)) { c.mat[0][0]=1; c.mat[0][1]=0; c.mat[0][2]=1; c.mat[0][3]=1; c.mat[1][0]=1; c.mat[1][1]=0; c.mat[1][2]=0; c.mat[1][3]=0; c.mat[2][0]=0; c.mat[2][1]=1; c.mat[2][2]=0; c.mat[2][3]=0; c.mat[3][0]=0; c.mat[3][1]=0; c.mat[3][2]=1; c.mat[3][3]=0; int ans=0; if(L==0) ans=0; else if(L==1) ans=2; else if(L==2) ans=4; else if(L==3) ans=6; else if(L==4) ans=9; else{ t=L-4; c=pow_mod(c,t); for(i=0;i<4;i++)//构造矩阵的(L-4)次幂后 再乘以前4项就是结果 ans+=c.mat[0][i]*b[i]; } printf("%d\n",ans%M); } }
公式是从网上找的。。。。
标签:
原文地址:http://www.cnblogs.com/orchidzjl/p/4326409.html