提交时间:2025-06-22 17:55:17
运行 ID: 38118
#include<iostream> #include<cstring> #include<cassert> #include<cmath> #include<map> #include<set> #include<queue> #include<stack> #include<cstdio> #include<vector> #include<time.h> #include<algorithm> using namespace std; #define REP(i,x,y) for(int i=x;i<=y;i++) #define rep(i,n) REP(i,1,n) #define rep0(i,n) REP(i,0,n-1) #define repG(i,x) for(int i=pos[x];~i;i=e[i].next) #define ll long long #define db double const int N=131500; const int M=19; const int INF=1e9+7; const int Mod=998244353; const ll mod=998244353; void Add(int &x,int y){x=(x+y<Mod)?(x+y):(x+y-Mod);} void Dec(int &x,int y){x=(x-y<0)?(x-y+Mod):(x-y);} int n; int a[M][M],f[M][M][N],g[M][M][N],h[M][N],F[M][N],G[M][N],p2[M],bc[N*2],tr1[N][M],tr2[N*2][M],t[M][M]; int main(){ scanf("%d",&n); rep0(i,n)rep0(j,n)scanf("%d",&a[i][j]); p2[0]=1; rep(i,n)p2[i]=p2[i-1]*2; rep0(i,(1<<n))bc[i]=i?(bc[i-(i&(-i))]+1):0; rep0(i,(1<<(n-1)))rep0(j,n)tr1[i][j]=p2[j]+i%p2[j]+(i-i%p2[j])*2; rep0(i,(1<<n))rep0(j,n)tr2[i][j]=i%p2[j]+(i-i%p2[j+1])/2; rep0(i,n){ F[i][0]=1; rep0(j,(1<<(n-1)))f[i][0][j]=1; } rep(i,n-1){ rep0(k,(1<<(n-1))){ if(bc[k]==i-1){ rep0(j,n){ int v=tr1[k][j],vf=F[j][k]; rep0(o,n)if(a[o][j]&&!((v>>o)&1))Add(f[o][i][tr2[v][o]],vf); } } } rep0(j,n-1){ rep0(k,(1<<(n-1))){ if(bc[k]<i)continue; if((k>>j)&1){ int fr=k-(1<<j),to=k; rep0(o,n)Add(f[o][i][to],f[o][i][fr]); } } } ll sum=0; rep0(k,(1<<(n-1))){ if(bc[k]<=i){ rep0(o,n){ sum=0; for(int j=0;j<=i;j++)sum=(sum+1ll*f[o][j][k]*f[o][i-j][k])%mod; h[o][k]=sum; } } } rep0(j,n-1){ rep0(k,(1<<(n-1))){ if(bc[k]>i)continue; if((k>>j)&1){ int fr=k-(1<<j),to=k; rep0(o,n)Dec(h[o][to],h[o][fr]); } } } rep0(k,(1<<(n-1)))if(bc[k]==i)rep0(o,n)F[o][k]=h[o][k]; } printf("%d\n",F[0][(1<<(n-1))-1]); G[0][(1<<(n-1))-1]=1; for(int i=n-1;i;i--){ rep0(k,(1<<(n-1)))if(bc[k]==i)rep0(o,n)g[o][i][k]=G[o][k]; rep0(j,n-1){ rep0(k,(1<<(n-1))){ if(bc[k]>i)continue; if((k>>j)&1){ int fr=k,to=k-(1<<j); rep0(o,n)Add(g[o][i][to],g[o][i][fr]); } } } rep0(k,(1<<(n-1))){ if(bc[k]<i)continue; int bk=(1<<(n-1))-1-k; rep0(o,n){ ll sum=0; for(int j=0;i+j<n;j++)sum=(sum+1ll*g[o][i+j][k]*f[o][j][bk])%mod; h[o][k]=(sum+sum)%mod; } } rep0(j,n-1){ rep0(k,(1<<(n-1))){ if(bc[k]<i)continue; if((k>>j)&1){ int fr=k,to=k-(1<<j); rep0(o,n)Dec(h[o][to],h[o][fr]); } } } rep0(k,(1<<(n-1))){ if(bc[k]==i){ rep0(j,n){ int v=tr1[k][j]-(1<<j),vf=h[j][k]; rep0(o,n){ if(a[j][o]&&((v>>o)&1)){ Add(G[o][tr2[v-(1<<o)][o]],vf); Dec(t[j][o],1ll*vf*F[o][tr2[v-(1<<o)][o]]%mod); } } } } } } rep0(i,n){ rep0(j,n){ if(a[i][j]){ int nj=j-(j>i); ll Ans=t[i][j]; rep0(k,(1<<(n-1)))if((k>>nj)&1)Ans=(1ll*F[i][k]*G[i][k]+Ans)%mod; printf("%lld ",Ans); } else printf("0 "); } puts(""); } return 0; }