杂题

可以用矩阵快速幂得到数列的每一项,怎么得到数列的前缀和?

对矩阵增加一行一列即可。

  • 问题描述

  • \(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;
} 
posted @ 2022-08-01 20:59  Qzong  阅读(34)  评论(0编辑  收藏  举报