WA#1求助
查看原帖
WA#1求助
554574
gyyyyx楼主2024/5/9 22:13
#include<bits/stdc++.h>
#define LL long long
#define mod 998244353
#define vec vector <LL>
#define mat vector <vec>
using namespace std;
LL fpow(LL a,LL b){
	if(!b) return 1;
	LL t(fpow(a,b>>1));
	if(b&1) return t*t%mod*a%mod;
	return t*t%mod;
}
inline mat mul(mat a,mat b,int len){
	mat c(len,vec(len,0));
	for(int i(0);i<len;++i)
		for(int j(0);j<len;++j)
			for(int k(0);k<len;++k)
				(c[i][j]+=a[i][k]*b[k][j]%mod)%=mod;
	return c;
}
int n;LL k,a[16],b[16];
bool vis[2][4];
int cnt,state[220],id[65536];
mat G,ans;
void DFS(int cur,int S){
	if(cur>=n*n){
		id[state[cnt]=S]=cnt++;
		return;
	}
	DFS(cur+1,S);
	int x(cur/n),y(cur%n);
	if(a[cur]&&!vis[0][x]&&!vis[1][y]){
		vis[0][x]=vis[1][y]=1;
		DFS(cur+1,S|(1<<cur));
		vis[0][x]=vis[1][y]=0;
	}
}
inline int update(int S,int x,int y){
	bool flg(0);
	for(int i(0);i<n;++i)
		if(S&(1<<x*n+i)) S^=(1<<x*n+i),flg=1;
	for(int i(0);i<n;++i)
		if(S&(1<<i*n+y)) S^=(1<<i*n+y),flg=1;
	if(!flg) S|=(1<<x*n+y);
	return id[S];
}
int main(){
	scanf("%d%lld",&n,&k);
	for(int i(0);i<n*n;++i) scanf("%lld",&a[i]);
	for(int i(0);i<n*n;++i) scanf("%lld",&b[i]);
	DFS(0,0);G.resize(cnt+5,vec(cnt+5,0));
	for(int i(0);i<cnt;++i){
		int S(state[i]);LL t(0),v(0);
		for(int cur(0);cur<n*n;++cur){
			t+=a[cur]-(S>>cur&1);
			if(S>>cur&1) v=(v+b[cur])%mod;
		}
		t=fpow(t,mod-2);
		for(int cur(0);cur<n*n;++cur)
			(G[i][update(S,cur/n,cur%n)]+=t*(a[cur]-(S>>cur&1)))%=mod;
		G[i][cnt]=v;
	}
	G[cnt][cnt]=1;ans=G;
	while(k){
		if(k&1) ans=mul(ans,G,cnt+1);
		G=mul(G,G,cnt+1);k>>=1;
	}
	printf("%lld\n",ans[0][cnt]);
	return 0;
}
2024/5/9 22:13
加载中...