题目大意:
f(n+1)=2*f(n-1)+f(n)+(n+1)^4
f(1)=a;f(2)=b;
求第n项。要mod
思路:裸的。。。构造矩阵
附上队友丑陋优秀的代码:
#include<bits/stdc++.h>
///#define mod 2147493647
using namespace std;
typedef long long ll;
const ll mod=2147493647UL;
struct matrix
{
ll m[10][10];
};
matrix mutil(matrix a,matrix b)
{
matrix c;
memset(c.m,0,sizeof(c.m));
for(int i=1;i<=7;i++)
{
for(int j=1;j<=7;j++)
{
for(int k=1;k<=7;k++)
{
c.m[i][j]+=(a.m[i][k]%mod*b.m[k][j]%mod)%mod;
}
c.m[i][j]%=mod;
}
}
return c;
}
matrix power(matrix A,ll k)
{
matrix ans;
for(int i=1;i<=7;i++)
{
for(int j=1;j<=7;j++)
{
if(i==j)
ans.m[i][j]=1;
else
ans.m[i][j]=0;
}
}
while(k)
{
if(k&1)
{
ans=mutil(ans,A);
k--;
}
k>>=1;
A=mutil(A,A);
}
return ans;
}
int main()
{
ll n,i,j,t;
ll a,b,res;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&a,&b);
if(n==1)
printf("%lld\n",a);
else if(n==2)
printf("%lld\n",b);
else
{
matrix A;
for(i=1;i<=7;i++)
{
for(j=1;j<=7;j++)
{
A.m[i][j]=0;
}
}
A.m[1][1]=1;A.m[1][2]=2;A.m[1][3]=1;
A.m[2][1]=1;
A.m[3][3]=1;A.m[3][4]=4;A.m[3][5]=6;A.m[3][6]=4;A.m[3][7]=1;
A.m[4][4]=1;A.m[4][5]=3;A.m[4][6]=3;A.m[4][7]=1;
A.m[5][5]=1;A.m[5][6]=2;A.m[5][7]=1;
A.m[6][6]=1;A.m[6][7]=1;
A.m[7][7]=1;
matrix ans=power(A,n-2);
res=0;
res=(res+ans.m[1][1]%mod*b%mod)%mod;
res=(res+ans.m[1][2]*a%mod)%mod;
res=(res+ans.m[1][3]*81%mod)%mod;
res=(res+ans.m[1][4]*27%mod)%mod;
res=(res+ans.m[1][5]*9%mod)%mod;
res=(res+ans.m[1][6]*3%mod)%mod;
res=(res+ans.m[1][7]%mod)%mod;
///res=(((ans.m[1][1]%mod*b%mod)%mod+(ans.m[1][2]*a)%mod)%mod+(ans.m[1][3]*81)%mod+(ans.m[1][4]*27)%mod+(ans.m[1][5]*9)%mod+(ans.m[1][6]*3)%mod+ans.m[1][7])%mod;
printf("%lld\n",res);
}
}
}