Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38092 | baka24 | 【BJ】T3 | C++ | 解答错误 | 0 | 1 MS | 280 KB | 2060 | 2025-06-16 19:32:05 |
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second #define mk make_pair #define pb push_back const int N=18,Mod=998244353; 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;} void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int n,ans,a[N][N],as[N][N],f[N][1<<N],w[N][1<<N],p[N][1<<N],g[N][1<<N]; string ejz(int x){string rt="";for(int i=0;i<n;i++)rt+=x&(1<<i)?"1":"0";return rt;} void slv(){ n=read(); for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=read(); for(int i=0;i<n;i++)w[i][0]=1; for(int s=0;s<1<<n;s++){ for(int j=0;j<n;j++)if(s&(1<<j)) for(int i=0;i<n;i++)if(!(s&(1<<i))) if(a[i][j])add(w[i][s],f[j][s]); for(int i=0;i<n;i++)if(!(s&(1<<i))){ f[i][s|(1<<i)]=w[i][0]*w[i][s]%Mod; for(int t=s;t;t=(t-1)&s)add(f[i][s|(1<<i)],w[i][t]*w[i][s^t]%Mod); } } g[0][(1<<n)-1]=1; for(int s=(1<<n)-1;s;s--){ for(int i=0;i<n;i++)if((s&(1<<i))){ for(int t=s;t<1<<n;t=(t+1)|s)add(p[i][s],g[i][t]*w[i][t^s]*2%Mod); } for(int i=0;i<n;i++)if(s&(1<<i)) for(int j=0;j<n;j++)if(s&(1<<j)){ if(a[i][j])add(g[j][s^(1<<i)],p[i][s]%Mod); } } // for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)cout<<i<<" "<<ejz(j)<<" "<<f[i][j]*g[i][j]<<endl; 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))){ int tmp=0; for(int t=s;t;t=(t-1)&s)if(t&(1<<j))add(tmp,(w[i][t]-f[j][t])*w[i][s^t]%Mod); add(as[i][j],tmp*g[i][s|(1<<i)]*2%Mod); } } printf("%lld\n",f[0][(1<<n)-1]); for(int i=0;i<n;i++){ for(int j=0;j<n;j++)printf("%lld ",as[i][j]); puts(""); } } signed main(){ // freopen("1.in","r",stdin);freopen("1.out","w",stdout); slv(); return 0; }