题意f(1)= a f(2)= b; f(n)= f(ni)+ 2 * f(n-2)+ n ^ 4
维护f(n)f(n-1)f(n-2)I ^ 4 I ^ 3 I ^ 2 I 1的值推导出f(n + 1)f(n)f(n-1)(I +1)^ 4(I + 1)^ 3(I + 1)^ 2(I + 1)1的值
ACcode:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 2147493647
#define llp 7
struct matrix
{
ll arr[8][8];
void clear()
{
memset(arr,0,sizeof(arr));
}
matrix operator * (const matrix &B) const
{
matrix C;C.clear();
for (int i=1;i<=llp;i++)
for (int j=1;j<=llp;j++)
{
for (int k=1;k<=llp;k++)
C.arr[i][j]=(C.arr[i][j]+arr[i][k]*B.arr[k][j])%mod;
}
return C;
}
};
matrix matrixPow(ll n,matrix B)
{
matrix A; A.clear();
for (int i=1;i<=7;i++)
A.arr[i][i]=1;
while(n)
{
if (n&1)
A=A*B;
B=B*B;
n>>=1;
}
return A;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
ll n,a,b;
scanf("%lld%lld%lld",&n,&a,&b);
if( n == 1)
printf("%lld",a);
else if(n == 2 )
printf("%lld",b);
else
{
matrix x,y,res;
x.clear();y.clear();
x.arr[1][1]=1; x.arr[1][2]=2; x.arr[1][3]=1;
x.arr[2][1]=1;
x.arr[3][3]=1; x.arr[3][4]=4; x.arr[3][5]=6;x.arr[3][6]=4; x.arr[3][7]=1;
x.arr[4][4]=1; x.arr[4][5]=3;x.arr[4][6]=3; x.arr[4][7]=1;
x.arr[5][5]=1;x.arr[5][6]=2; x.arr[5][7]=1;
x.arr[6][6]=1; x.arr[6][7]=1;
x.arr[7][7]=1;
res=matrixPow(n-2,x);
y.arr[1][1]=b;
y.arr[2][1]=a;
y.arr[3][1]=81;
y.arr[4][1]=27;
y.arr[5][1]=9;
y.arr[6][1]=3;
y.arr[7][1]=1;
matrix ans =res*y;
printf("%lld\n",ans.arr[1][1]);
}
}
return 0;
}