Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38174 | baka24 | 【BJ】T2 | C++ | 运行超时 | 85 | 5000 MS | 687596 KB | 3787 | 2025-06-24 18:25:41 |
#include<bits/stdc++.h> using namespace std; #define ll unsigned 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; inline 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;} inline void add(int &x,int y){x+=y;if(x>=Mod)x-=Mod;} int n,P,ans,a[N][N],as[N][N],f[N][M],p[N][M],g[N][M],h[N][M],pt[1<<N]; int fp[N][N][M],gp[N][N][M],tr[N][M],tr2[N][M],rt[N][1<<N]; // string ejz(int x){string res="";for(int i=0;i<n;i++)res+=(x&(1<<i))?"1":"0";return res;} 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++)fp[i][0][0]=1; for(int i=0;i<n;i++){ int cnt=0,cnt2=0; for(int j=0;j<1<<n;j++)if(j&(1<<i))rt[i][j]=cnt,tr[i][cnt++]=j;else rt[i][j]=cnt2,tr2[i][cnt2++]=j; } for(int o=0;o<n;o++){ for(int i=0;i<n;i++) for(int s=0;s<1<<n-1;s++)if(pt[s]==o) for(int j=0;j<n;j++) if(tr2[i][s]&(1<<j)) if(a[i][j])add(fp[i][o][s],f[j][rt[j][tr2[i][s]]]); for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]>=o)add(fp[k][o][j],fp[k][o][rt[k][tr2[k][j]^(1<<i)]]); for(int i=0;i<n;i++){ for(int s=0;s<1<<n-1;s++)if(pt[s]<=o){ ll res=fp[i][o][s]*(o?2:1); for(int k=1;k<o;k++)res+=(ll)fp[i][k][s]*fp[i][o-k][rt[i][tr2[i][s]]]; h[i][s]=res%Mod; } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]<=o)add(h[k][j],Mod-h[k][rt[k][tr2[k][j]^(1<<i)]]); for(int j=0;j<n;j++) for(int s=0;s<1<<n-1;s++)if(pt[s]==o) f[j][rt[j][tr2[j][s]|(1<<j)]]=h[j][s]; } // return; g[0][0]=gp[0][0][0]=1; for(int o=0;o<n;o++){ for(int j=0;j<n;j++) for(int s=0;s<1<<n-1;s++)if(pt[s]==o){ for(int i=0;i<n;i++)if(tr2[j][s]&(1<<i)){ if(a[i][j])add(gp[j][o][s],p[i][rt[i][tr2[j][s]]]),add(g[j][s],p[i][rt[i][tr2[j][s]]]); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]>=o)add(gp[k][o][j],gp[k][o][rt[k][tr2[k][j]^(1<<i)]]); for(int i=0;i<n;i++){ for(int s=0;s<1<<n-1;s++)if(pt[s]<=o){ ll res=0; for(int k=0;k<=o;k++)res+=(ll)gp[i][k][s]*fp[i][o-k][s]; h[i][s]=res%Mod; add(h[i][s],h[i][s]); } } for(int k=0;k<n;k++)for(int i=0;i<n;i++)if(i!=k)for(int j=0;j<1<<n-1;j++)if((tr2[k][j]&(1<<i))&&pt[j]<=o)add(h[k][j],Mod-h[k][rt[k][tr2[k][j]^(1<<i)]]); for(int j=0;j<n;j++) for(int s=0;s<1<<n-1;s++)if(pt[s]==o) p[j][rt[j][tr2[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][rt[i][s]]*g[i][rt[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][rt[j][s^(1<<i)]]*p[i][rt[i][s^P^(1<<i)]]%Mod); } printf("%d\n",f[0][rt[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("3.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; }