[CSU1911]Card Game(FWT)

[vjudge-CSU1911]

FWT_or

#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
    register LL x=0,f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return f*x;
}

const int N=19;
const int MAXN=1<<N;

LL a[MAXN],b[MAXN];
int T,n,m,len,Q;

/*inline void FWT(LL *A,int type){
    for(int i=2;i<=len;i<<=1)
        for(int j=0,p=i>>1;j<len;j+=i)
            for(int k=j;k<j+p;k++)
                A[k+p]+=A[k]*type;
}*/
void FWT(LL *P,int opt)
{
    for(int i=2;i<=N;i<<=1)
        for(int p=i>>1,j=0;j<N;j+=i)
            for(int k=j;k<j+p;++k)
                P[k+p]+=P[k]*opt;
}


int main(){
    T=read();
    for(int Case=1;Case<=T;Case++){
        printf("Case #%d:\n",Case);
        n=read(),m=read();len=1<<m;
        memset(a,0,sizeof a);memset(b,0,sizeof b);
        for(int i=1;i<=n;i++) a[read()]++;
        for(int i=1;i<=n;i++) b[read()]++;
        FWT(a,1);FWT(b,1);
        for(int i=0;i<len;i++) a[i]*=b[i];
        FWT(a,-1);
        Q=read();
        while(Q--) printf("%lld\n",a[read()]);
    }
}

猜你喜欢

转载自www.cnblogs.com/lizehon/p/10547370.html
FWT