https://vjudge.net/contest/242514#problem/A
f[n+1]=2*f[n-1]+f[n]+(n+1)^4;
(n+1)^4=n^4+4*n^3+6*n^2+4*n+1;
f[n+1]=2*f[n-1]+f[n]+n^4+4*n^3+6*n^2+4*n+n^0;
构造矩阵
#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<math.h>
#include<map>
#define inf 0x3f3f3f3f
const long long mod=2147493647;//long long不能用int
using namespace std;
struct node
{
long long m[7][7];
};
node juzhen(node a,node b)
{
node num;
memset(num.m,0,sizeof(num.m));
for(int i=0; i<7; i++)
for(int j=0; j<7; j++)
for(int k=0; k<7; k++)
{
num.m[i][j]=(num.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
}
return num;
}
node mul(node r,long long n)
{
node cc;
memset(cc.m,0,sizeof(cc.m));
for(int i=0; i<7; i++)
cc.m[i][i]=1;
while(n)
{
if(n%2)
cc=juzhen(cc,r);
n/=2;
r=juzhen(r,r);
}
return cc;
}
int main()
{
node a= { 0,1,0,0,0,0,0,
2,1,1,4,6,4,1,
0,0,1,4,6,4,1,
0,0,0,1,3,3,1,
0,0,0,0,1,2,1,
0,0,0,0,0,1,1,
0,0,0,0,0,0,1 };
int t;
scanf("%d",&t);
while(t--)
{
long long n,aa,bb;
scanf("%lld%lld%lld",&n,&aa,&bb);
if(n==1)
printf("%lld\n",aa);
if(n==2)
printf("%lld\n",bb);
else
{
node ans=mul(a,n-2);
long long ss=0;
ss=(ss+ans.m[1][0]*aa)%mod;
ss=(ss+ans.m[1][1]*bb)%mod;
ss=(ss+ans.m[1][2]*16)%mod;
ss=(ss+ans.m[1][3]*8)%mod;
ss=(ss+ans.m[1][4]*4)%mod;
ss=(ss+ans.m[1][5]*2)%mod;
ss=(ss+ans.m[1][6]*1)%mod;
printf("%lld\n",ss);
}
}
}