Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38138 | LYLAKIOIAKIOI | 【BJ】T2 | C++ | 解答错误 | 0 | 2500 MS | 428100 KB | 2515 | 2025-06-23 20:53:27 |
#include<bits/stdc++.h> using namespace std; const int N=19,MS=132000,mod=998244353; inline void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} inline void Sub(int &a,int b){a-=b;if(a<0) a+=mod;} inline void Mul(int &a,int b){a=1ll*a*b%mod;} bool Mbg; int f[N][MS],tf[N][MS];//count-tmp int dc[N][N];//decval int a[N][N]; int n; #define ppc __builtin_popcount int tmp[N][MS],trf[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++) Add(trf[j][pw][i],tf[j][i]); 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 return 0; }