题解:CF1906K Deck-Building Game
问题等价于先选出一个异或和为
可以通过生成函数刻画答案,不妨令
我们考察下
不妨设
下面考虑求解
根据 FWT 的线性性,
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int maxn = (1<<20);
int a[maxn],n;
void fwt_xor(int *f,int x=1){
for(int o=2,k=1;o<=maxn;o<<=1,k<<=1){
for(int i=0;i<maxn;i+=o){
for(int j=0;j<k;j++){
int a=f[i+j];
int b=f[i+j+k];
f[i+j]=(a+b)%mod;
f[i+j+k]=(a+mod-b)%mod;
f[i+j]=f[i+j]*x%mod,f[i+j+k]=f[i+j+k]*x%mod;
}
}
}
}
int b[maxn];
int c[maxn];
int qpow(int a,int b){
if(b==0) return 1;
if(b==1) return a;
int res=qpow(a,b/2);
res=res*res%mod;
if(b%2==1) res=res*a%mod;
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],b[0]++,b[a[i]]+=2;
fwt_xor(b);
for(int i=0;i<maxn;i++) b[i]=((3*n+mod-b[i])%mod)/4;
for(int i=0;i<maxn;i++) c[i]=qpow(mod-1,b[i])*qpow(3,n-b[i])%mod;
fwt_xor(c,(mod+1)/2);
cout<<c[0]<<"\n";
return 0;
}