提交时间:2025-06-24 18:11:55
运行 ID: 38170
#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][M],h[N][1<<N],gp[N][N][M],tr[N][M],tr2[N][M],rt[N][1<<N]; // 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))rt[i][j]=cnt,tr[i][cnt++]=j;else rt[i][j]=cnt2,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][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++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[tr2[k][j]]>=o)add(fp[k][o][j],fp[k][o][rt[k][tr2[k][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][s]*(o?2:1); for(int k=1;k<o;k++)res+=(ll)fp[i][k][s]*fp[i][o-k][rt[i][tr2[i][s]]]; h[i][tr2[i][s]]=res%Mod; } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]<=o)add(h[k][tr2[k][j]],Mod-h[k][tr2[k][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 j=0;j<n;j++) for(int s=0;s<1<<n-1;s++)if(pt[tr2[j][s]]==o){ for(int i=0;i<n;i++)if(tr2[j][s]&(1<<i)){ if(a[i][j])add(gp[j][o][s],p[i][tr2[j][s]]),add(g[j][tr2[j][s]],p[i][tr2[j][s]]); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[tr2[k][j]]>=o)add(gp[k][o][j],gp[k][o][rt[k][tr2[k][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][s]*fp[i][o-k][s]*2; h[i][tr2[i][s]]=res%Mod; } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]<=o)add(h[k][tr2[k][j]],Mod-h[k][tr2[k][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("3.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; }