1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include<bits/stdc++.h> using namespace std; using ll=long long; const int mod=998244353; const int inv2=(mod+1)/2; const int G=3; const int NG=(mod+1)/G; inline int read() { int s=0,w=1;char ch; while((ch=getchar())>'9'||ch<'0') if(ch=='-') w=-1; while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int wh[2097152]; ll jc[2097153]; ll inv[2097153]; ll f[2097152]; ll g[2097152]; ll p2[2097152]; ll q2[2097152]; int t[1048577]; int n,m,B,L; template<typename A> inline void FWT(A *f,int m,int typ) { for(int i=0;i<m;i++) for(int j=0;j<(1<<m);j++) if(j&(1<<i)) { ll num1=f[j^(1<<i)],num2=f[j]; if(typ) f[j^(1<<i)]=(num1+num2)%mod,f[j]=(num1-num2+mod)%mod; else f[j^(1<<i)]=(num1+num2)*inv2%mod,f[j]=(num1-num2+mod)*inv2%mod; } } inline ll qow(ll a,ll b) { ll ans=1; while(b) { if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } inline void NTT(ll *f,int L,bool dft) { for(int i=0;i<L;i++) if(i<wh[i]) swap(f[i],f[wh[i]]); for(int len=2;len<=L;len<<=1) { ll step=qow(dft?G:NG,(mod-1)/len); for(int l=0,r=len;l<L;l+=len,r+=len) { int mid=(l+r)>>1;ll now=1; for(int i=l,j=mid;j<r;i++,j++) { ll num=f[j]*now%mod; f[j]=(f[i]-num+mod)%mod; f[i]=(f[i]+num)%mod; now=now*step%mod; } } } if(!dft) { ll num=qow(L,mod-2); for(int i=0;i<L;i++) f[i]=f[i]*num%mod; } } inline ll C(int a,int b) { if(a<b||b<0) return 0; return jc[a]*inv[b]%mod*inv[a-b]%mod; } inline void init() { L=p2[0]=jc[0]=q2[0]=1;while(L<2*n+2) L<<=1; for(int i=1;i<L;i++) p2[i]=p2[i-1]*2%mod,q2[i]=q2[i-1]*inv2%mod;
for(int i=1;i<=L;i++) jc[i]=jc[i-1]*i%mod; inv[L]=qow(jc[L],mod-2); for(int i=L;i;i--) inv[i-1]=inv[i]*i%mod;
for(int i=0;i<L;i++) wh[i]=(wh[i>>1]>>1)+(i&1?L>>1:0); for(int i=0;i<=n;i++) { f[i]=inv[i]; g[i]=q2[i]*inv[i]%mod*C(n-i,B-n+i)%mod; } NTT(f,L,1),NTT(g,L,1); for(int i=0;i<L;i++) f[i]=f[i]*g[i]%mod; NTT(f,L,0); } int main() { n=read(),m=read(),B=read();init(); for(int i=1;i<=n;i++) t[0]++,t[read()]++; FWT(t,m,1);for(int i=0;i<(1<<m);i++) t[i]/=2;
for(int i=0;i<(1<<m);i++) { g[i]=p2[2*n-B]*f[t[i]]%mod*jc[t[i]]%mod; if((n-t[i])&1) g[i]=(mod-g[i])%mod; } FWT(g,m,0); for(int i=0;i<(1<<m);i++) { if(i) putchar(' '); printf("%lld",g[i]); } return 0; }
|