题意:
给出一个表达式 fn= fn-1 + 2*f(n-2 ) +n^4
思路:
重点在于n^4 的拆解,如何可以拆解为n-1的若干项的形式,可以考虑用二项式展开来拆解,也就是将n^4 拆解为 ((n-1)+1)^4,之后C(4,0)(n-1)^4+C(4,1)(n-1)^3如此即可
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;
typedef long long ll;
ll n,m;
const int maxn=8;
const ll mod=2147493647;
struct Matrix//矩阵的类
{
ll a[maxn][maxn];
void init() //将其初始化为单位矩阵
{
memset(a,0,sizeof(a));
for(int i=1;i<maxn;i++)
a[i][i]=1;
}
} ;
Matrix mul(Matrix a,Matrix b) //(a*b)%mod 矩阵乘法
{
Matrix ans;
memset(ans.a,0,sizeof(ans.a));
for(int i=1;i<maxn;i++)
{
ans.a[i][i]=1;
}
for(int i=1;i<maxn;i++)
for(int j=1;j<maxn;j++)
{
ans.a[i][j]=0;
for(int k=1;k<maxn;k++)
ans.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;
ans.a[i][j]%=mod;
}
return ans;
}
Matrix pow(Matrix a)
{
Matrix res ;
memset(res.a,0,sizeof(res.a));
for(int i=1;i<maxn;i++)
{
res.a[i][i]=1;
}
while(n)
{
if(n&1)
{
res=mul(a,res);
}
a=mul(a,a);
n/=2;
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a,b;
scanf("%lld%lld%lld",&n,&a,&b);
Matrix ans;
ans.a[1][1]=b,ans.a[2][1]=a,ans.a[3][1]=16,ans.a[4][1]=8,ans.a[5][1]=4,ans.a[6][1]=2,ans.a[7][1]=1;
Matrix base,res;
ll sss[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,1,4,6,4,1},
{0,1,0,0,0,0,0,0},
{0,0,0,1,4,6,4,1},
{0,0,0,0,1,3,3,1},
{0,0,0,0,0,1,2,1},
{0,0,0,0,0,0,1,1},
{0,0,0,0,0,0,0,1}};
for(int i=0;i<=7;i++)
{
for(int j=0;j<=7;j++)
base.a[i][j]=sss[i][j];
}
if(n==1)
{
printf("%lld\n",a);
}
else if(n==2)
{
printf("%lld\n",b);
}
else
{
n=n-2;
res=pow( base );
ans=mul(res,ans);
printf("%lld\n",ans.a[1][1]);
}
}
}