题目地址:戳这里
求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;
}
}
}