萌新求助卡常
查看原帖
萌新求助卡常
578628
Undead2008楼主2023/10/4 08:46
#include<bits/stdc++.h>
using namespace std;
const int maxn = 167;
const int mo = 998244353;
int T,m,k,N;
long long n;
int tot,Idx;
struct tup{
	int s[4];
	bool operator < (const tup &x)const{
		for(int i=1;i<=3;i++)
			if(s[i]<x.s[i])return 1;
			else if(s[i]>x.s[i])return 0;
		return 0;
	}
}r[maxn],cur;
map<tup,int>mp;
void dfs(int Id){
	if(Id==m+1){
		mp[cur]=++Idx;
		r[Idx]=cur;
		return;
	}
	for(int i=0;i<=k-tot;i++){
		tot+=i;
		cur.s[Id]=i;
		dfs(Id+1);
		cur.s[Id]=0;
		tot-=i;
	}
}
struct Matrix{
	int x[maxn][maxn];
	void clear(int ty){
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++)
				x[i][j]=(ty?(i==j):0);
	} 
	Matrix operator * (const Matrix t){
		Matrix ret;
		ret.clear(0);
		for(int i=1;i<=N;i++)
			for(int j=1;j<=N;j++)
				for(int k=1;k<=N;k++)
					ret.x[j][i]=(1ll*ret.x[j][i]+(1ll*x[j][k]*t.x[k][i])%mo)%mo;
		return ret;
	}
	void outp(){
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++)
				cout<<x[i][j]<<' ';
			cout<<endl;
		}
	}
}O,o,base[62];
Matrix ksm(int t){
	Matrix ret;
	ret.clear(1);
	O=o;
	while(t){
		if(t&1)ret=ret*O;
		O=O*O;
		t>>=1;
	}
	return ret;
}
int ksm(int b,int t){
	int ret=1;
	while(t){
		if(t&1)ret=(1ll*ret*b)%mo;
		b=(1ll*b*b)%mo;
		t>>=1;
	}
	return ret;
}
int inv(int x){
	return ksm(x,mo-2);
}
int ans[2][maxn];
signed main(){
	cin>>T>>m>>k;
	for(int i=0;i<=3;i++)
		cur.s[i]=0;
	dfs(1);
	N=Idx+1;
	int Id=mp[{(m==1),(m==2),(m==3)}];
	for(int i=1;i<=N;i++)
		O.x[i][N]=1;
	O.x[N][N]=o.x[N][N]=1;
	for(int i=1;i<=Idx;i++){
		int S[4]={0,0,0,0},tot=0;
		for(int j=1;j<=m;j++)
			S[j]=r[i].s[j],tot+=S[j];
		for(int j=1;j<=m;j++){
			if(S[j]==0)continue;
			tup gen;
			if(tot==k||j==1)gen={0,S[1]-(j==1)+(j==2),S[2]-(j==2)+(j==3),S[3]-(j==3)};
			else gen={0,S[1]-(j==1)+(j==2)+(m==1),S[2]-(j==2)+(j==3)+(m==2),S[3]-(j==3)+(m==3)};
			o.x[i][mp[gen]]=(1ll*S[j]*inv(tot+1))%mo;
		}
		o.x[i][i]=o.x[i][N]=inv(tot+1);
	}
	base[0]=o;
	for(int i=1;i<=60;i++)
		base[i]=base[i-1]*base[i-1];
	while(T--){
		cin>>n;
		int pos=mp[{{0,(m==1),(m==2),(m==3)}}];
		for(int i=1;i<=N;i++)
			ans[0][i]=ans[1][i]=0;
		ans[0][pos]=1;
		int cnt=0;
		for(int r=0;r<=60;r++)
			if(n&(1ll<<r)){
				cnt++;
				int ooo=cnt&1;
				for(int i=1;i<=N;i++)
					ans[ooo][i]=0;
				for(int i=1;i<=N;i++){
					for(int j=1;j<=N;j++)
						ans[ooo][i]=(ans[ooo][i]+(1ll*ans[ooo^1][j]*base[r].x[j][i])%mo)%mo;
				}
			}
		cout<<ans[cnt&1][N]<<endl;
	}
}
2023/10/4 08:46
加载中...