wa,样例全过,矩阵快速幂求调
查看原帖
wa,样例全过,矩阵快速幂求调
1205369
qinzixu楼主2024/10/24 11:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
struct M{
	int a[6][6];
	M(){memset(a,0,sizeof(a));}
}t[4],sum,E,ans;
int n,k,a[5];
M operator*(const M &a,const M &b)
{
	M ans;
	for(int i=0;i<=5;i++)
		for(int j=0;j<=5;j++)
			for(int k=0;k<=5;k++)
				ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
	return ans;
}

M Pow(M a,int b)
{
	M x;
	x=E;
	while(b){
		if(b&1)x=x*a;
		a=a*a;
		b>>=1;
	}
	return x;
}

void init(){
	t[1].a[0][1]=t[1].a[1][2]=t[1].a[2][3]=t[1].a[3][4]=t[1].a[4][5]=t[1].a[5][5]=1;
	t[2].a[0][1]=t[2].a[1][0]=t[1].a[2][1]=t[2].a[3][2]=t[2].a[4][3]=t[2].a[5][4]=1;
	t[3].a[0][1]=t[3].a[1][0]=t[3].a[2][1]=t[3].a[3][2]=t[3].a[4][3]=t[3].a[5][4]=1;
	t[3].a[0][1]=t[3].a[1][2]=t[3].a[2][3]=t[3].a[3][4]=t[3].a[4][5]=t[3].a[5][5]=1;
	E.a[0][0]=E.a[1][1]=E.a[2][2]=E.a[3][3]=E.a[4][4]=E.a[5][5]=1;//单位矩阵 
	sum=E;
}

signed main()
{
	init();
	cin>>n>>k;
	for(int i=1;i<=4;i++)
	{
		cin>>a[i];
		sum=sum*t[a[i]];
	}
	ans.a[0][k]=1;
	ans=ans*Pow(sum,n/4);
	for(int i=0;i<n%4-1;i++)ans=ans*t[a[i+1]];
	cout<<(ans.a[0][0]+ans.a[0][1]+ans.a[0][2]+ans.a[0][3]+ans.a[0][4]+ans.a[0][5])%mod;
	return 0;
}
2024/10/24 11:55
加载中...