提交时间:2025-06-23 21:04:21
运行 ID: 38149
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back #define popcnt __builtin_popcount const int N=18,Mod=998244353,M=133333; inline int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} inline void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int n,P,ans,a[N][N],as[N][N],f[N][1<<N],w[N][1<<N],p[N][1<<N],g[N][1<<N],pt[1<<N]; int fp[N][N][1<<N],h[N][1<<N],gp[N][N][1<<N],tr[N][M],tr2[N][M]; // string ejz(int x){string res="";for(int i=0;i<n;i++)res+=(x&(1<<i))?"1":"0";return res;} void slv(){ n=read(),P=(1<<n)-1; for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=read(); for(int i=0;i<1<<n;i++)pt[i]=popcnt(i); for(int i=0;i<n;i++)w[i][0]=fp[i][0][0]=1; for(int i=0;i<n;i++){ int cnt=0,cnt2=0; for(int j=0;j<1<<n;j++)if(j&(1<<i))tr[i][cnt++]=j;else tr2[i][cnt2++]=j; } for(int o=0;o<n;o++){ for(int i=0;i<n;i++) for(int s=0;s<1<<n-1;s++)if(pt[tr2[i][s]]==o) for(int j=0;j<n;j++) if(tr2[i][s]&(1<<j)) if(a[i][j])add(fp[i][o][tr2[i][s]],f[j][tr2[i][s]]),add(w[i][tr2[i][s]],f[j][tr2[i][s]]); for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n-1;j++)if(pt[tr[i][j]]>=o)add(fp[k][o][tr[i][j]],fp[k][o][tr[i][j]^(1<<i)]); for(int i=0;i<n;i++){ for(int s=0;s<1<<n-1;s++)if(pt[tr2[i][s]]<=o){ ll res=fp[i][o][tr2[i][s]]*(o?2:1); for(int k=1;k<o;k++)res+=(ll)fp[i][k][tr2[i][s]]*fp[i][o-k][tr2[i][s]]; h[i][tr2[i][s]]=res%Mod; } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n-1;j++)if(pt[j]<=o)add(h[k][tr[i][j]],Mod-h[k][tr[i][j]^(1<<i)]); for(int s=0;s<1<<n;s++)if(pt[s]==o) for(int j=0;j<n;j++)if(!(s&(1<<j)))f[j][s|(1<<j)]=h[j][s]; } // return; g[0][0]=gp[0][0][0]=1; for(int o=0;o<n;o++){ for(int i=0;i<n;i++) for(int s=0;s<1<<n-1;s++)if(pt[tr[i][s]]==o){ for(int j=0;j<n;j++)if(!(tr[i][s]&(1<<j))){ if(a[i][j])add(gp[j][o][tr[i][s]],p[i][tr[i][s]]),add(g[j][tr[i][s]],p[i][tr[i][s]]); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n-1;j++)add(gp[k][o][tr[i][j]],gp[k][o][tr[i][j]^(1<<i)]); for(int i=0;i<n;i++){ for(int s=0;s<1<<n-1;s++)if(pt[tr2[i][s]]<=o){ ll res=0; for(int k=0;k<=o;k++)res+=(ll)gp[i][k][tr2[i][s]]*fp[i][o-k][tr2[i][s]]*2; h[i][tr2[i][s]]=res%Mod; } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n-1;j++)if((tr[i][j]&(1<<i)))add(h[k][tr[i][j]],Mod-h[k][tr[i][j]^(1<<i)]); for(int s=0;s<1<<n;s++)if(pt[s]==o)for(int j=0;j<n;j++)if(!(s&(1<<j)))p[j][s|(1<<j)]=h[j][s]; } for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(a[i][j]){ for(int s=0;s<1<<n;s++)if((s&(1<<i))&&(s&(1<<j)))add(as[i][j],(ll)f[i][s]*g[i][s^P]%Mod); for(int s=0;s<1<<n;s++)if((s&(1<<i))&&(s&(1<<j)))add(as[i][j],Mod-(ll)f[j][s^(1<<i)]*p[i][s^P^(1<<i)]%Mod); } printf("%d\n",f[0][(1<<n)-1]); for(int i=0;i<n;i++){ for(int j=0;j<n;j++)printf("%d ",as[i][j]); puts(""); } } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); //cerr<<(clock()*1.0)/CLOCKS_PER_SEC<<"s"<<endl; // system("grep VmPeak /proc/$PPID/status"); return 0; }