Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38178 LYLAKIOI 【BJ】T2 C++ 通过 100 4676 MS 507148 KB 4024 2025-06-24 19:11:25

Tests(20/20):


#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back #define ppc __builtin_popcount using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn=4e5+10,mod=998244353; const ull lim=1.7e19,sub=lim/mod*mod; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } const int N=18; int n,a[N][N]; int f[1<<N][N],g[1<<N][N],tw[N][N][1<<N-1],tw2[N][N][1<<N-1],h[N][N],tag[1<<N][N]; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} inline void FWT(int n,int *f){ up(i,0,n-1)for(int j=0;j<(1<<n);j+=(1<<i+1))up(k,j,j+(1<<i)-1) f[k+(1<<i)]=add(f[k+(1<<i)],f[k]); } inline void iFWT(int n,int *f){ up(i,0,n-1)for(int j=0;j<(1<<n);j+=(1<<i+1))up(k,j,j+(1<<i)-1) f[k+(1<<i)]=add(f[k+(1<<i)],mod-f[k]); } inline int get(int S,int i){return ((S>>i+1)<<i)|(S&((1<<i)-1));} ull tt[N][1<<N]; int t[N][1<<N]; ull s[N][1<<N]; inline void Add(ull &a,ull b){if((a+=b)>=lim)a-=sub;} void slv(){ n=read(); up(i,0,n-1)up(j,0,n-1)a[i][j]=read(); up(i,0,n-1)f[1<<i][i]=1; up(_,1,n){ memset(t,0,sizeof(t)); memset(tt,0,sizeof(tt)); memset(s,0,sizeof(s)); if(_>1)up(i,1,_-2)up(p,0,n-1)up(k,0,(1<<n)-1)Add(tt[p][k],tw[i][p][k]*1llu*tw[_-1-i][p][k]); up(i,0,n-1)up(j,0,(1<<n-1)-1)t[i][j]=tt[i][j]%mod; up(i,0,n-1)iFWT(n-1,t[i]); up(i,0,(1<<n)-1)if(ppc(i)==_)up(j,0,n-1)if((i>>j)&1){ int U=i^(1<<j); if(_>1){ f[i][j]=t[j][get(U,j)]%mod; //cout<<"now "<<i<<" "<<j<<" "<<f[i][j]<<endl; up(p,0,n-1)if((U>>p)&1)if(a[j][p])f[i][j]=add(f[i][j],f[U][p]*2ll%mod); } up(k,0,n-1)if(a[k][j])if(_<n)if(!((i>>k)&1))s[k][get(i,k)]+=f[i][j]; } if(_<n)up(j,0,n-1){ up(p,0,(1<<n-1)-1)tw[_][j][p]=s[j][p]%mod; FWT(n-1,tw[_][j]); } } g[(1<<n)-1][0]=1; down(_,n,1){ memset(t,0,sizeof(t)); memset(tt,0,sizeof(tt)); memset(s,0,sizeof(s)); up(i,_+1,n)up(p,0,n-1)up(k,0,(1<<n-1)-1)Add(tt[p][k],tw2[n-i][p][k]*1llu*tw[i-_][p][k]); up(i,0,n-1)up(j,0,(1<<n-1)-1)t[i][j]=tt[i][j]%mod; up(i,0,n-1)iFWT(n-1,t[i]); up(i,0,n-1){ up(j,0,(1<<n)-1){ int s=((1<<n)-1)^j; if(ppc(s)==_&&(!((s>>i)&1))) tag[s][i]=add(tag[s][i],t[i][get(j,i)]%mod); } } int all=(1<<n)-1; //up(i,0,(1<<n)-1)if(ppc(i)==_)up(j,0,n-1) up(i,1,(1<<n)-1)if(ppc(i)==_)up(j,0,n-1)if((i>>j)&1){ up(k,0,n-1)if(a[k][j])g[i][j]=add(g[i][j],tag[i][k]); int U=i^(1<<j); if(U)s[j][get(all^U,j)]+=g[i][j]*2; up(p,0,n-1)if((U>>p)&1)if(a[j][p]) g[U][p]=add(g[U][p],g[i][j]*2ll%mod),h[j][p]=add(h[j][p],g[i][j]*2ll*f[U][p]%mod); } if(_-1>0)up(j,0,n-1){ up(p,0,(1<<n-1)-1)tw2[n-(_-1)][j][p]=s[j][p]%mod; FWT(n-1,tw2[n-(_-1)][j]); } } up(i,0,(1<<n)-1) up(j,0,n-1) up(k,0,n-1) h[j][k]=add(h[j][k],f[i][k]*1ll*tag[i][j]%mod); printf("%d\n",f[(1<<n)-1][0]); up(i,0,n-1){ up(j,0,n-1){ if(!a[i][j])printf("0 "); else { int ans=mod-h[i][j]; up(k,0,(1<<n)-1)if(((k>>i)&1)&&((k>>j)&1))ans=add(ans,f[k][i]*1ll*g[k][i]%mod); printf("%d ",ans); } }printf("\n"); } } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); slv(); //cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }


测评信息: