Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38124 | LYLAKIOI | 【BJ】T2 | C++ | 解答错误 | 75 | 815 MS | 19416 KB | 2290 | 2025-06-22 19:37:29 |
#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 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 f[1<<15][15],g[1<<15][15],w[1<<15][15],h[15][15],lazy[1<<15][15],tag[1<<15][15]; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} 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(i,0,(1<<n)-1)up(j,0,n-1)if((i>>j)&1){ int U=i^(1<<j); for(int S=(U-1)&U;S;S=(S-1)&U){ int sum1=w[U^S][j],sum2=w[S][j]; f[i][j]=add(f[i][j],sum1*1ll*sum2%mod); } 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])w[i][k]=add(w[i][k],f[i][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=w[U^S][j]; tag[S][j]=add(tag[S][j],g[i][j]*2ll*sum%mod); lazy[S][j]=add(lazy[S][j],sum*2ll*g[i][j]%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*lazy[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(); return 0; }