杂题
可以用矩阵快速幂得到数列的每一项,怎么得到数列的前缀和?
对矩阵增加一行一列即可。
-
问题描述
-
\(a_n=x*a_{n-1}+y*a_{n-2}\)
-
求 \(\sum_{i=1}^{n}{a_i^3}\)
将式子展开,矩阵快速幂求解即可。
#include<cstdio>
#include<cstring>
#define ull unsigned long long
const int H=5000010;
char G[H],*_=G;
ull read(){
ull x=0;
while(*_<'0'||'9'<*_)_++;
while('0'<=*_&&*_<='9')x=x*10+(*_++^'0');
return x;
}
const int M=5;
const unsigned int mod=998244353;
struct node{
ull a[M][M];
node operator*(const node&A)const {
node c;
memset(c.a,0,sizeof c.a);
for(int i=0;i<M;i++)for(int j=0;j<M;j++){
for(int k=0;k<M;k++)c.a[i][j]+=a[i][k]*A.a[k][j];
c.a[i][j]%=mod;
}
return c;
}
}a,ans;
int main(){
fread(G,1,H,stdin);
int T=read();
while(T--){
ull n=read(),a1=read(),a2=read(),x=read(),y=read(),Ans;
if(n==1)printf("%llu\n",a1);
else if(n==2)printf("%llu\n",a2);
else {
a.a[0][0]=1,a.a[0][1]=x*x%mod*x%mod,a.a[0][2]=x*x%mod*y*3%mod,a.a[0][3]=3*x*y%mod*y%mod,a.a[0][4]=y*y%mod*y%mod,
a.a[1][0]=0,a.a[1][1]=x*x%mod*x%mod,a.a[1][2]=3*x*x%mod*y%mod,a.a[1][3]=3*x*y%mod*y%mod,a.a[1][4]=y*y%mod*y%mod,
a.a[2][0]=0,a.a[2][1]=x*x%mod,a.a[2][2]=2*x*y%mod,a.a[2][3]=y*y%mod,a.a[2][4]=0,
a.a[3][0]=0,a.a[3][1]=x,a.a[3][2]=y,a.a[3][3]=0,a.a[3][4]=0,
a.a[4][0]=0,a.a[4][1]=1,a.a[4][2]=0,a.a[4][3]=0,a.a[4][4]=0;
memset(ans.a,0,sizeof ans.a);
ans.a[0][0]=ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=ans.a[4][4]=1;
n-=2;
while(n){
if(n&1)ans=ans*a;
n>>=1,a=a*a;
}
Ans=(ans.a[0][0]*(a1*a1%mod*a1+a2*a2%mod*a2)%mod+ans.a[0][1]*a2%mod*a2%mod*a2+ans.a[0][2]*a2%mod*a2%mod*a1+ans.a[0][3]*a2%mod*a1%mod*a1+ans.a[0][4]*a1%mod*a1%mod*a1)%mod;
printf("%llu\n",Ans);
}
}
return 0;
}