Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38125 | baka24 | 【BJ】T2 | C++ | 运行超时 | 80 | 5000 MS | 612524 KB | 3209 | 2025-06-22 19:39:47 |
#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; 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;if(x<0)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][1<<N],h[N][1<<N],gp[N][N][1<<N]; 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 o=0;o<n;o++){ for(int s=0;s<1<<n;s++)if(pt[s]==o){ 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(fp[i][o][s],f[j][s]),add(w[i][s],f[j][s]); } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if(pt[j]>=o&&(j&(1<<i)))add(fp[k][o][j],fp[k][o][j^(1<<i)]); for(int s=0;s<1<<n;s++)if(pt[s]<=o){ for(int i=0;i<n;i++)if(!(s&(1<<i))){ h[i][s]=fp[i][o][s]*(o?2:1)%Mod; for(int k=1;k<o;k++)add(h[i][s],(ll)fp[i][k][s]*fp[i][o-k][s]%Mod); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if(pt[j]<=o&&(j&(1<<i)))add(h[k][j],Mod-h[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]; } g[0][0]=gp[0][0][0]=1; for(int o=0;o<n;o++){ for(int s=0;s<1<<n;s++)if(pt[s]==o){ 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(gp[j][o][s],p[i][s]),add(g[j][s],p[i][s]); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if((j&(1<<i)))add(gp[k][o][j],gp[k][o][j^(1<<i)]); for(int s=0;s<1<<n;s++)if(pt[s]<=o){ for(int i=0;i<n;i++)if(!(s&(1<<i))){ h[i][s]=0; for(int k=0;k<=o;k++)add(h[i][s],(ll)gp[i][k][s]*fp[i][o-k][s]*2%Mod); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<1<<n;j++)if((j&(1<<i)))add(h[k][j],Mod-h[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("1.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; }