提交时间:2025-06-16 19:18:57
运行 ID: 38090
#include<bits/stdc++.h> using namespace std; const int N=20,MS=35000,mod=998244353; void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} void Sub(int &a,int b){a-=b;if(a<0) a+=mod;} void Mul(int &a,int b){a=1ll*a*b%mod;} int f[N][MS],tf[N][MS];//count-tmp int g[N][MS],tg[N][MS];//num-tmp int h[N][MS],dc[N][N];//decval int a[N][N]; int n; bool next_subset(int &a,int b){ if(!a) return 0; a=(a-1)&b;return 1; } /* int solve(int x=0,int y=0){ if(x&&y) if(!a[x][y]) return 0; memset(f,0,sizeof(f)); memset(t,0,sizeof(t)); a[x][y]=0; for(int i=1;i<=n;i++) t[i][0]=1; int U=(1<<n)-1; for(int i=1;i<=U;i++){ for(int j=1;j<=n;j++){ if(x&&y) if(j==y&&((i>>(x-1))&1)) continue; if(!((i>>(j-1))&1)) continue; //son=1 int S=i^(1<<(j-1)); //Add(f[j][i],2ll*t[j][S]%mod); //son=2 int T=S; do{ int ST=S^T; //if(!T||!ST) continue; if(x&&y) if(((T>>(x-1))&1)&&((ST>>(y-1))&1)) continue; if(x&&y) if(((T>>(y-1))&1)&&((ST>>(x-1))&1)) continue; Add(f[j][i],1ll*t[j][T]*t[j][ST]%mod); }while(next_subset(T,S)); for(int k=1;k<=n;k++){ if((i>>(k-1))&1) continue; if(a[k][j]) Add(t[k][i],f[j][i]); } //cout<<i<<' '<<j<<' '<<f[j][i]<<endl; } } a[x][y]=1; return f[1][U]; } */ int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } int U=(1<<n)-1; memset(f,0,sizeof(f)); memset(tf,0,sizeof(tf)); for(int i=1;i<=n;i++) tf[i][0]=1; for(int i=0;i<=U;i++){ for(int j=1;j<=n;j++){ if(!((i>>(j-1))&1)) continue; //son=1 int S=i^(1<<(j-1)); //Add(f[j][i],2ll*t[j][S]%mod); //son=2 int T=S; do{ int O=S^T; Add(f[j][i],1ll*tf[j][T]*tf[j][O]%mod); }while(next_subset(T,S)); for(int k=1;k<=n;k++){ if((i>>(k-1))&1) continue; if(a[k][j]) Add(tf[k][i],f[j][i]); } } } memset(g,0,sizeof(g)); memset(tg,0,sizeof(tg)); g[1][U]=1; for(int i=U;i>=1;i--){ for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; int S=U^i^(1<<(j-1)),T=S; do{ int A=i|T|(1<<(j-1)); Add(tg[j][i],2ll*tf[j][T]*g[j][A]%mod); }while(next_subset(T,S)); //cout<<"tg:"<<j<<' '<<i<<' '<<tg[j][i]<<endl; for(int k=1;k<=n;k++){ if(!((i>>(k-1))&1)) continue; if(a[j][k]) Add(g[k][i],tg[j][i]); //cout<<"to:"<<k<<' '<<tg[j][i]<<endl; } } } memset(h,0,sizeof(h)); for(int i=1;i<=U;i++){ for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; int S=U^i^(1<<(j-1)),T=S; do{ int A=i|T|(1<<(j-1)); Add(h[j][i],2ll*tf[j][T]*g[j][A]%mod); }while(next_subset(T,S)); for(int k=1;k<=n;k++){ if(!((i>>(k-1))&1)) continue; if(a[j][k]) Sub(dc[j][k],1ll*h[j][i]*f[k][i]%mod); } } } cout<<f[1][U]<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int ans=dc[i][j]; for(int k=1;k<=U;k++){ if((k>>(j-1))&1) Add(ans,1ll*f[i][k]*g[i][k]%mod); } if(!a[i][j]) ans=0; cout<<ans<<' '; }cout<<endl; } return 0; }