链接:hdu5950 Recursive sequence
题意:f[1]=a,f[2]=b,f[i]=f[i-1]+2f[i-2]+i^4(I>=3),求f[n]%mod 。
思路:
矩阵快速幂
首先构造矩阵,如下:
(n+1)4=n4+4n3+6n2+4n+1.
然后直接写代码就行了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const ll MOD=2147493647;
ll c1[7];
ll c[7][7];
ll t;
ll n,a1,b1;
void mul(ll f[7] ,ll a[7][7]){
memset(c1,0,sizeof(c1));
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
c1[i]=(c1[i]%MOD+f[j]*a[j][i]%MOD)%MOD;
memcpy(f,c1,sizeof(c1));
}
void mulself(ll a[7][7]){
memset(c,0,sizeof(c));
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
for(int k=0;k<7;k++)
c[i][j]=(c[i][j]%MOD+a[i][k]%MOD*a[k][j]%MOD)%MOD;
memcpy(a,c,sizeof(c));
}
int main(){
cin>>t;
while(t--){
cin>>n>>a1>>b1;
ll f[7]={b1,a1,81,27,9,3,1};
ll a[7][7]={ {1,1,0,0,0,0,0},
{2,0,0,0,0,0,0},
{1,0,1,0,0,0,0},
{0,0,4,1,0,0,0},
{0,0,6,3,1,0,0},
{0,0,4,3,2,1,0},
{0,0,1,1,1,1,1}};
if(n==1) printf("%lld\n",a1%MOD);
else if(n==2) printf("%lld\n",b1%MOD);
else {
n-=2;
while(n){
if(n&1) mul(f,a);
mulself(a);
n>>=1;
}
printf("%lld\n",f[0]);
}
}
return 0;
}