提交时间:2025-06-23 21:07:36
运行 ID: 38154
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcount using namespace std; typedef long long ll; const int maxn=4e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[15][15]; int ww[1<<15][15]; int f[1<<15][15],g[1<<15][15],tw[15][15][1<<15],h[15][15],tag[1<<15][15]; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} inline void FWT(int n,int *f){ up(i,0,n-1)for(int j=0;j<(1<<n);j+=(1<<i+1))up(k,j,j+(1<<i)-1) f[k+(1<<i)]=add(f[k+(1<<i)],f[k]); } inline void iFWT(int n,int *f){ up(i,0,n-1)for(int j=0;j<(1<<n);j+=(1<<i+1))up(k,j,j+(1<<i)-1) f[k+(1<<i)]=add(f[k+(1<<i)],mod-f[k]); } int t[15][1<<15]; void slv(){ n=read(); up(i,0,n-1)up(j,0,n-1)a[i][j]=read(); up(i,0,n-1)f[1<<i][i]=1; up(_,1,n){ memset(t,0,sizeof(t)); if(_>1)up(i,1,_-2)up(p,0,n-1)up(k,0,(1<<n)-1)t[p][k]=add(t[p][k],tw[i][p][k]*1ll*tw[_-1-i][p][k]%mod); up(i,0,n-1)iFWT(n,t[i]); up(i,0,(1<<n)-1)if(ppc(i)==_)up(j,0,n-1)if((i>>j)&1){ int U=i^(1<<j); if(_>1){ f[i][j]=t[j][U]; //cout<<"now "<<i<<" "<<j<<" "<<f[i][j]<<endl; up(p,0,n-1)if((U>>p)&1)if(a[j][p])f[i][j]=add(f[i][j],f[U][p]*2ll%mod); } up(k,0,n-1)if(a[k][j]){ if(_<n)tw[_][k][i]=add(tw[_][k][i],f[i][j]); ww[i][k]=add(ww[i][k],f[i][j]); } } if(_<n)up(j,0,n-1)FWT(n,tw[_][j]); } g[(1<<n)-1][0]=1; down(i,(1<<n)-1,1)up(j,0,n-1)if((i>>j)&1){ up(k,0,n-1)if(a[k][j])g[i][j]=add(g[i][j],tag[i][k]); int U=i^(1<<j); for(int S=(U-1)&U;S;S=(S-1)&U){ int sum=0; sum=ww[U^S][j]; tag[S][j]=add(tag[S][j],g[i][j]*2ll*sum%mod); } up(p,0,n-1)if((U>>p)&1)if(a[j][p]) g[U][p]=add(g[U][p],g[i][j]*2ll%mod),h[j][p]=add(h[j][p],g[i][j]*2ll*f[U][p]%mod); } up(i,0,(1<<n)-1) up(j,0,n-1) up(k,0,n-1) h[j][k]=add(h[j][k],f[i][k]*1ll*tag[i][j]%mod); printf("%d\n",f[(1<<n)-1][0]); up(i,0,n-1){ up(j,0,n-1){ if(!a[i][j])printf("0 "); else { int ans=mod-h[i][j]; up(k,0,(1<<n)-1)if(((k>>i)&1)&&((k>>j)&1))ans=add(ans,f[k][i]*1ll*g[k][i]%mod); printf("%d ",ans); } }printf("\n"); } } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); slv(); cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }