http://acm.split.hdu.edu.cn/showproblem.php?pid=5950
根据题意就会得到Fn=Fn-1+Fn-2+n^4,可以根据这个公式来构建矩阵,再用矩阵快速幂求解,这道题主要难在如果用矩阵来构造n^4,具体过程就是一个数学问题,要用的a^4-b^4的公式展开。
#include<iostream>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;
struct js{
long long int ma[33][33];
};
js operator * (js a,js b)
{
js c;
int i,j,k;
memset(c.ma,0,sizeof(c.ma));
for(i=0;i<7;i++)
for(j=0;j<7;j++) b
for(k=0;k<7;k++)
{
c.ma[j][k]+=a.ma[j][i] * b.ma[i][k];
c.ma[j][k]=c.ma[j][k]%2147493647;
}
return c;
}
js operator ^ (js a,int k)
{
js c;
int i,j;
for(i=0;i<7;i++)
for(j=0;j<7;j++)
{
if(i==j)c.ma[i][j]=1;
else c.ma[i][j]=0;
}
while(k)
{
if(k&1)c=c*a;
a=a*a;
k >>= 1;
}
return c;
}
js op (js a,js b)
{
js c;
int i,j,k;
memset(c.ma,0,sizeof(c.ma));
for(i=0;i<7;i++)
for(j=0;j<7;j++)
for(k=0;k<1;k++)
{
c.ma[j][k]+=a.ma[j][i] * b.ma[i][k];
c.ma[j][k]=c.ma[j][k]%2147493647;
}
return c;
}
int main(){
int t;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
long long int ans;
long long int f1,f2;
cin>>ans>>f1>>f2;
js a;
a.ma[0][0]=f2;
a.ma[1][0]=f1;
a.ma[2][0]=16;
a.ma[3][0]=8;
a.ma[4][0]=4;
a.ma[5][0]=2;
a.ma[6][0]=1;
if(ans==1)cout<<f1<<endl;
else if(ans==2)cout<<f2<<endl;
else {
js b;
b.ma[0][0]=1;
b.ma[0][1]=2;
b.ma[0][2]=1;
b.ma[0][3]=4;
b.ma[0][4]=6;
b.ma[0][5]=4;
b.ma[0][6]=1;
b.ma[1][0]=1;
b.ma[1][1]=0;
b.ma[1][2]=0;
b.ma[1][3]=0;
b.ma[1][4]=0;
b.ma[1][5]=0;
b.ma[1][6]=0;
b.ma[2][0]=0;
b.ma[2][1]=0;
b.ma[2][2]=1;
b.ma[2][3]=4;
b.ma[2][4]=6;
b.ma[2][5]=4;
b.ma[2][6]=1;
b.ma[3][0]=0;
b.ma[3][1]=0;
b.ma[3][2]=0;
b.ma[3][3]=1;
b.ma[3][4]=3;
b.ma[3][5]=3;
b.ma[3][6]=1;
b.ma[4][0]=0;
b.ma[4][1]=0;
b.ma[4][2]=0;
b.ma[4][3]=0;
b.ma[4][4]=1;
b.ma[4][5]=2;
b.ma[4][6]=1;
b.ma[5][0]=0;
b.ma[5][1]=0;
b.ma[5][2]=0;
b.ma[5][3]=0;
b.ma[5][4]=0;
b.ma[5][5]=1;
b.ma[5][6]=1;
b.ma[6][0]=0;
b.ma[6][1]=0;
b.ma[6][2]=0;
b.ma[6][3]=0;
b.ma[6][4]=0;
b.ma[6][5]=0;
b.ma[6][6]=1;
js aa=b^(ans-2);
aa=op(aa,a);aa.ma[0][0]=aa.ma[0][0]%2147493647;
cout<<aa.ma[0][0]<<endl;
}
}
}
return 0;
}