Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38169 | LYLAKIOIAKIOI | 【BJ】T2 | C++ | 运行超时 | 80 | 5000 MS | 475548 KB | 5413 | 2025-06-24 18:02:15 |
#include<bits/stdc++.h> using namespace std; const int N=19,MS=132000,mod=998244353; inline void Add(int &a,int b){a=(a+b<mod)?(a+b):(a+b-mod);} inline void Sub(int &a,int b){a=(a-b<0)?(a+mod-b):(a-b);} inline void Mul(int &a,int b){a=1ll*a*b%mod;} bool Mbg; int f[N][MS],tf[N][MS];//count-tmp int g[N][MS<<1],tg[N][MS];//num-tmp int dc[N][N];//decval int a[N][N]; int n; #define ppc __builtin_popcount int tmp[N][MS],trf[N][N][MS],trg[N][N][MS]; int tof[N][MS<<1],ito[N][MS<<1]; //id-set,id-power-set bool Med; int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } int U=(1<<n)-1; for(int i=U;i>=0;i--){ for(int j=1;j<=n;j++){ int S=(1<<(j-1))-1; tof[j][i]=(i&S)|((i>>1)&(U^S)); ito[j][tof[j][i]]=i;//{j}\in i after //cout<<j<<' '<<i<<' '<<tof[j][i]<<' '<<S<<endl; } } //memset(trf,0,sizeof(trf)); for(int i=1;i<=n;i++) tf[i][0]=1; for(int pw=0;pw<=n;pw++){ //cout<<pw<<endl; for(int i=1;i<=U;i++){ //cout<<i<<endl; if(ppc(i)!=pw) continue; for(int j=1;j<=n;j++){ if(!((i>>(j-1))&1)) continue; Add(f[j][tof[j][i]],tmp[j][tof[j][i^(1<<(j-1))]]); //cout<<j<<' '<<i<<' '<<f[j][tof[j][i]]<<endl; for(int k=1;k<=n;k++){ if((i>>(k-1))&1) continue; if(a[k][j]) Add(tf[k][tof[k][i]],f[j][tof[j][i]]); } } } memset(tmp,0,sizeof(tmp)); for(int j=1;j<=n;j++){ //FMT(tf[j],n-1); for(int k=0;k<n-1;k++){ for(int i=0;i<=((U>>1)>>1);i++){ //if((j>>i)&1) continue; Add(tf[j][ito[k+1][i]|(1<<k)],tf[j][ito[k+1][i]]); } } for(int i=0;i<=(U>>1);i++) trf[j][pw][i]+=tf[j][i]; for(int i=0;i<=(U>>1);i++) trf[j][pw][i]%=mod; for(int p=0;p<=pw;p++){ for(int i=0;i<=(U>>1);i++){ Add(tmp[j][i],1ll*trf[j][p][i]*trf[j][pw-p][i]%mod); } } //IFMT(tmp[j],n-1); for(int k=0;k<n-1;k++){ for(int i=0;i<=((U>>1)>>1);i++){ //if((j>>i)&1) continue; Sub(tmp[j][ito[k+1][i]|(1<<k)],tmp[j][ito[k+1][i]]); } } }//may swap(p,i) memset(tf,0,sizeof(tf)); }//tf->f after memset(tmp,0,sizeof(tmp)); g[1][U^U]=1; //rev g for(int pw=0;pw<=n;pw++){ for(int i=U;i>=0;i--){ if(ppc(i)!=pw) continue; for(int j=1;j<=n;j++){ if(((i^U)>>(j-1))&1) continue; //cout<<"tmp: "<<j<<' '<<i<<' '<<tmp[j][S]<<endl; Add(tg[j][tof[j][i^U]],2ll*tmp[j][tof[j][i^(1<<(j-1))]]%mod); for(int k=1;k<=n;k++){ if(!(((i^U)>>(k-1))&1)) continue; if(a[j][k]) Add(g[k][tof[k][i]],tg[j][tof[j][i^U]]); } } } memset(tmp,0,sizeof(tmp)); for(int j=1;j<=n;j++){ //FMT(g[j],n-1); for(int k=0;k<n-1;k++){ for(int i=0;i<=((U>>1)>>1);i++){ //if((j>>i)&1) continue; Add(g[j][ito[k+1][i]|(1<<k)],g[j][ito[k+1][i]]); } } for(int i=0;i<=(U>>1);i++) trg[j][pw][i]+=g[j][i]; for(int i=0;i<=(U>>1);i++) trg[j][pw][i]%=mod; for(int p=0;p<=pw;p++){ for(int i=0;i<=(U>>1);i++){ Add(tmp[j][i],1ll*trf[j][p][i]*trg[j][pw-p][i]%mod); } } //IFMT(tmp[j],n-1); for(int k=0;k<n-1;k++){ for(int i=0;i<=((U>>1)>>1);i++){ //if((j>>i)&1) continue; Sub(tmp[j][ito[k+1][i]|(1<<k)],tmp[j][ito[k+1][i]]); } } }memset(g,0,sizeof(g)); } g[1][U>>1]=1; for(int i=U;i>=1;i--){ for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; for(int k=1;k<=n;k++){ if(!((i>>(k-1))&1)) continue; if(a[j][k]) Add(g[k][tof[k][i]],tg[j][tof[j][i]]); //cout<<"to:"<<k<<' '<<tg[j][i]<<endl; } } } for(int i=1;i<=U;i++){ for(int j=1;j<=n;j++){ if((i>>(j-1))&1) continue; int S=U^i^(1<<(j-1)),T=S; for(int k=1;k<=n;k++){ if(!((i>>(k-1))&1)) continue; if(a[j][k]) Sub(dc[j][k],1ll*tg[j][tof[j][i]]*f[k][tof[k][i]]%mod); } } } cout<<f[1][U>>1]<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int ans=dc[i][j]; for(int k=1;k<=U;k++){ if(((k>>(j-1))&1)&&((k>>(i-1))&1)) Add(ans,1ll*f[i][tof[i][k]]*g[i][tof[i][k]]%mod); } if(!a[i][j]) ans=0; cout<<ans<<' '; }cout<<endl; } //system("grep VmPeak /proc/$PPID/status"); //cerr<<(&Mbg-&Med)/1024.0/1024.0<<endl; return 0; }