FWT

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define swap(a,b) (a^=b^=a^=b)
inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	return x*f;
}

#define mod 998244353
#define inv2 499122177

ll a[1<<17],b[1<<17],c[1<<17],N;

inline void FWT_or(ll *a,int f)
{
	register int i,j,p,k;
	for(i=1;i<N;i<<=1)for(p=i<<1,j=0;j<N;j+=p)for(k=0;k<i;++k)
        a[i+j+k]=(a[i+j+k]+a[j+k]*f+mod)%mod;
}

inline void FWT_and(ll *a,int f)
{
	register int i,j,p,k;
	for(i=1;i<N;i<<=1)for(p=i<<1,j=0;j<N;j+=p)for(k=0;k<i;++k)
        a[j+k]=(a[j+k]+a[i+j+k]*f+mod)%mod;
}

inline void FWT_xor(ll *a,bool f)
{
	register int i,j,p,k;
	for(i=1;i<N;i<<=1)for(p=i<<1,j=0;j<N;j+=p)for(k=0;k<i;++k)
    {
        int X=a[j+k],Y=a[i+j+k];
        a[j+k]=(X+Y)%mod;a[i+j+k]=(X+mod-Y)%mod;
        if(f==0)a[j+k]=1ll*a[j+k]*inv2%mod,a[i+j+k]=1ll*a[i+j+k]*inv2%mod;
    }
}

int main()
{
	N=1<<read();register int i;
	
	for(i=0;i<N;++i) a[i]=1ll*read()%mod;
	for(i=0;i<N;++i) b[i]=1ll*read()%mod;
	
    FWT_or(a,1);FWT_or(b,1);
    for(i=0;i<N;++i) c[i]=1ll*a[i]*b[i]%mod;
    FWT_or(a,-1);FWT_or(b,-1);FWT_or(c,-1);
    for(i=0;i<N;++i) printf("%lld ",c[i]);puts("");
    
    FWT_and(a,1);FWT_and(b,1);
    for(i=0;i<N;++i) c[i]=1ll*a[i]*b[i]%mod;
    FWT_and(a,-1);FWT_and(b,-1);FWT_and(c,-1);
    for(i=0;i<N;++i) printf("%lld ",c[i]);puts("");
    
    FWT_xor(a,1);FWT_xor(b,1);
    for(i=0;i<N;++i) c[i]=1ll*a[i]*b[i]%mod;
    FWT_xor(a,0);FWT_xor(b,0);FWT_xor(c,0);
    for(i=0;i<N;++i) printf("%lld ",c[i]);puts("");
    
    return 0;
}
posted @ 2020-12-02 18:18  HexQwQ  阅读(90)  评论(0)    收藏  举报