【题目太长 直接压缩了下】
当n>=3时有,F[n] = 2f[n - 1] + 3f[n - 2] + 3*n^5
输入T表示测试案例的组数(1e3)
接下来T行,每行三个数字n, a, b (1 <= n,a,b <= 2^31 )
表示数列第一项是a, 第二项是b
Output
对于每组数据你需要输出一行,代表计算数列的第n项模2147493647 的结果。
SampleInput
2
3 1 1
3 1 2
SampleOutput
734
736
显然on直接TLE 所以需要降复杂度 看到了递推式 显然矩阵快速幂 那么唯一的难点就是构造矩阵了
这里的矩阵构造主要难在了 n^5的处理 怎么把n跟(n-1)扯上关系 这里就用到了二项展开式了
这个推出来后 这题简直是轻松+easy啊
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=2147493647;
struct node///结构体存矩阵
{
ll sb[9][9];
} hsy,sum;
ll biao[9][9]= ///构造的矩阵
{
0,0,0,0,0,0,0,0,0,
0,2,1,0,0,0,0,0,0,
0,3,0,0,0,0,0,0,0,
0,3,0,1,0,0,0,0,0,
0,15,0,5,1,0,0,0,0,
0,30,0,10,4,1,0,0,0,
0,30,0,10,6,3,1,0,0,
0,15,0,5,4,3,2,1,0,
0,3,0,1,1,1,1,1,1,
};
node juzhen(ll a[][9],ll b[][9])///矩阵相乘
{
node shit;
memset(shit.sb,0,sizeof shit.sb);
for(int i=1; i<=8; i++)
{
for(int j=1; j<=8; j++)
{
for(int k=1; k<=8; k++)
{
shit.sb[i][j]=(shit.sb[i][j]%mod+((a[i][k]%mod)*(b[k][j]%mod))%mod)%mod;
}
}
}
return shit;
}
ll qsm(ll a,ll b,ll n) ///快速幂
{
memset(sum.sb,0,sizeof sum.sb);
memcpy(hsy.sb, biao, 81*sizeof(ll));
sum.sb[1][1]=b,sum.sb[1][2]=a,sum.sb[1][8]=1;
ll s=1;
for(ll i=1; i<=5; i++)
{
s*=2;
sum.sb[1][8-i]=s;
}
while(n)
{
if(n&1)
sum=juzhen(sum.sb,hsy.sb);
hsy=juzhen(hsy.sb,hsy.sb);
n/=2;
}
cout<<sum.sb[1][1]%mod<<endl;
}
int main()
{
int t;
ll a,b,n;
cin>>t;
while(t--)
{
scanf("%lld%lld%lld",&n,&a,&b);
if(n>=3)
qsm(a%mod,b%mod,n-2);
else if(n==1)
cout<<a%mod<<endl;
else
cout<<b%mod<<endl;
}
}