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
| #include <cstring> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define ll long long const int N=1<<20; const ll mod=998244353; const ll inv2=(mod+1)/2; const ll inv4=inv2*inv2%mod; inline int read() { int x=0; char ch=getchar(); bool f=0; for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=1; for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48); return f?-x:x; } inline ll Pow(ll x,int y) { ll ans=1; for(;y;y>>=1,x=x*x%mod) if(y&1) ans=ans*x%mod; return ans; } inline void fwt(int n,ll *a,int t) { ll x,y; for(int i=1;i<n;i<<=1) for(int j=0;j<n;j+=(i<<1)) for(int k=0;k<i;k++) { x=a[j+k],y=a[i+j+k]; a[j+k]=(x+y)%mod,a[i+j+k]=(x-y+mod)%mod; if(t!=1) (a[j+k]*=inv2)%=mod,(a[i+j+k]*=inv2)%=mod; } } int n,k,m,a,b,c,s; ll x,y,z,d1,d2,d3,d4,f1[N],f2[N],f3[N],g[N]; int main() { n=read(); k=read(); m=1<<k; x=read(),y=read(),z=read(); for(int i=1;i<=n;i++) { a=read(),b=read(),c=read(); f1[a^b]++,f2[a^c]++,f3[b^c]++; s^=a; } fwt(m,f1,1); fwt(m,f2,1); fwt(m,f3,1); d1=(x+y+z)%mod; d2=(mod+x+y-z)%mod; d3=(x-y+z+mod)%mod; d4=(x-y-z+mod+mod)%mod; for(int i=0;i<m;i++) g[i]= Pow(d1,((ll)n+f1[i]+f2[i]+f3[i])%mod*inv4%mod)* Pow(d2,((ll)n+f1[i]-f2[i]-f3[i]+mod*2)%mod*inv4%mod)%mod* Pow(d3,((ll)n-f1[i]+f2[i]-f3[i]+mod*2)%mod*inv4%mod)%mod* Pow(d4,((ll)n-f1[i]-f2[i]+f3[i]+mod*2)%mod*inv4%mod)%mod; fwt(m,g,-1); for(int i=0;i<m;i++) printf("%lld ",g[i^s]); return 0; }
|