看见阅读数挺多的但是这篇文章还没完工,来补一下:
答案等价于求解 \([y^0]\prod \limits_{i=1}^n(1+x^{a_i}y)\mod y^m-1\),其中 \(x\) 的乘积是异或卷积。将其 FWT 后,\([x^w]\) 等于 \([y^0]\prod \limits_{i=1}^n(1+(-1)^{|a_i\&w|}y) \mod y^m-1\),注意到这个东西是一个 \((1+y)^k(1-y)^{n-k}\) 的形式,注意到将 \(\sum \limits_{i=1}^nx^{a_i}\) FWT 后 \([x^w]\sum \limits_{i=1}^n(-1)^{|w\&a_i|}\),这是与起来的数量为偶数的数量减去与起来为奇数的数量,而他们总和是 \(n\),所以得到这两个后带入原柿即可。
#include<bits/stdc++.h>
using namespace std;
#define N 200005
#define p 998244353
#define ll long long
#define i2 499122177
int n,m,k,L=20,a[N],f[1<<21],d[1<<21];
int b[N][105],c[N][105];
ll qpow(ll a,int b){
ll ans=1;
for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;
return ans;
}
void fwt(int a[],int n){
for(int m=1;m<n;m<<=1)
for(int* b=a;b!=a+n;b+=m+m)
for(int j=0;j<m;j++){
int x=b[j],y=b[j|m];
b[j]=x-y,b[j|m]=x+y;
}
}
void ifwt(int a[],int n){
for(int m=1;m<n;m<<=1)
for(int* b=a;b!=a+n;b+=m+m)
for(int j=0;j<m;j++){
int x=b[j],y=b[j|m];
b[j]=1ll*(x+y)*i2%p,b[j|m]=1ll*(y-x+p)*i2%p;
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),++f[a[i]];
fwt(f,1<<L);
b[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
b[i][j]=(b[i-1][j]+b[i-1][(j-1+m)%m])%p;
c[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<m;j++)
c[i][j]=(c[i-1][j]-c[i-1][(j-1+m)%m]+p)%p;
for(int i=0;i<1<<L;i++){
int x=(f[i]+n)/2,y=(n-f[i])/2;
for(int j=0;j<m;j++)d[i]=(d[i]+1ll*b[x][j]*c[y][(m-j)%m])%p;
}
ifwt(d,1<<L);
int ans=0;
for(int i=0;i<1<<L;i++)
ans=(ans+d[i]*qpow(i,k))%p;
printf("%d\n",ans);
}