H.Playing games

fwt

#include<bits/stdc++.h>
using namespace std;

const int N=1<<19;
const int mod=1000000007;
const int inv2=(mod+1)/2;

void fwt(int *a,int n)
{
    for(int i=1;i<n;i<<=1)
        for(int p=i<<1,j=0;j<n;j+=p)
            for(int k=j;k<j+i;k++)
            {
                int x=a[k],y=a[i+k];
                a[k]=(x+y)%mod;
                a[i+k]=(x-y+mod)%mod;
            }
}
void ifwt(int *a,int n)
{
    for(int i=1;i<n;i<<=1)
        for(int p=i<<1,j=0;j<n;j+=p)
            for(int k=j;k<j+i;k++)
            {
                int x=a[k],y=a[i+k];
                a[k]=1LL*(x+y)*inv2%mod;
                a[i+k]=1LL*(x-y+mod)*inv2%mod;
            }
}
int a[22][N],n;
int main()
{
    scanf("%d",&n);
    int s=0;
    for(int i=1;i<=n;++i)
    {
        int x;
        scanf("%d",&x);
        a[0][x]=1;
        s^=x;
    }
    a[0][0]=1;
    fwt(a[0],N);
    for(int i=1;i<22;++i)
        for(int j=0;j<N;++j)
            a[i][j]=1LL*a[i-1][j]*a[0][j]%mod;
    if(s==0)printf("%d
",n);
    else
    {
        for(int i=0;i<22;++i)
        {
            ifwt(a[i],N);
            if(a[i][s])
            {
                printf("%d
",n-i-1);
                break;
            }
        }
    }
    return 0;
}
/********************

********************/

原文地址:https://www.cnblogs.com/acjiumeng/p/9485449.html