woj 1540 Fibonacci 矩阵快速幂
题目地址:戳这里
求Fibonacci数列前n项的立方和。
比赛的时候.. 构造一个10*10的矩阵 跪了,很多无用信息:
代码:
#include<iostream> using namespace std; const int mod=1000000007; struct Matrix { long long p[10][10]; }; Matrix multi(Matrix A,Matrix B) { Matrix ans; long long sum=0; for(int i=0;i<10;i++) for(int j=0;j<10;j++) { sum=0; for(int k=0;k<10;k++) sum=(sum+(A.p[i][k]*B.p[k][j])%mod)%mod; ans.p[i][j]=sum; } return ans; } Matrix quick_mod(Matrix A,int n) { Matrix ans; for(int i=0;i<10;i++) for(int j=0;j<10;j++) ans.p[i][j]=(i==j?1:0); while(n>0) { if(n&1) { ans=multi(ans, A); } n>>=1; A=multi(A, A); } return ans; } int main() { int n; while (cin>>n) { if(!n) break; if(n==1) cout<<1<<endl; else if(n==2) cout<<2<<endl; else { Matrix ans; for(int i=0;i<10;i++) for(int j=0;j<10;j++) ans.p[i][j]=0; ans.p[0][1]=1; ans.p[1][0]=1; ans.p[1][1]=1; ans.p[2][3]=1; ans.p[3][3]=1; ans.p[3][4]=2; ans.p[4][3]=1; ans.p[4][4]=1; ans.p[5][5]=2; ans.p[5][6]=1; ans.p[5][8]=1; ans.p[6][5]=1; ans.p[6][8]=1; ans.p[7][8]=1; ans.p[8][5]=3; ans.p[8][6]=3; ans.p[8][7]=1; ans.p[8][8]=1; ans.p[9][8]=1; ans.p[9][9]=1; ans=quick_mod(ans, n-1); // for(int i=0;i<3;i++) // { // for(int j=0;j<3;j++) // { // cout<<ans.p[i][j]<<' '; // } // cout<<endl; // // } long long result=0; for(int i=0;i<10;i++) result=(result+ans.p[9][i])%mod; cout<<result<<endl; } } }
2 实际上5*5 就可以了
#include<iostream> using namespace std; const int mod=1000000007; struct Matrix { long long p[5][5]; }; Matrix a; Matrix multi(Matrix A,Matrix B) { Matrix ans; long long sum=0; for(int i=0;i<5;i++) for(int j=0;j<5;j++) { sum=0; for(int k=0;k<5;k++) sum=(sum+(A.p[i][k]*B.p[k][j])%mod)%mod; ans.p[i][j]=sum; } return ans; } Matrix quick_mod(Matrix A,int n) { Matrix ans; for(int i=0;i<5;i++) for(int j=0;j<5;j++) ans.p[i][j]=(i==j?1:0); while(n>0) { if(n&1) { ans=multi(ans, A); } n>>=1; A=multi(A, A); } return ans; } int main() { int n; while (cin>>n) { if(!n) break; if(n==1) cout<<1<<endl; else if(n==2) cout<<2<<endl; else { Matrix ans; for(int i=0;i<5;i++) for(int j=0;j<5;j++) ans.p[i][j]=0; ans.p[0][1]=1; ans.p[1][0]=1; ans.p[1][1]=1; ans.p[1][2]=3; ans.p[1][3]=3; ans.p[2][1]=1; ans.p[2][3]=1; ans.p[3][1]=1; ans.p[3][2]=1; ans.p[3][3]=2; ans.p[4][1]=1; ans.p[4][4]=1; ans=quick_mod(ans, n-1); long long result=0; for(int i=0;i<5;i++) result=(result+ans.p[4][i])%mod; cout<<result<<endl; } } }
posted on 2014-03-30 23:55 814jingqi的ACM 阅读(160) 评论(0) 编辑 收藏 举报