看见阅读数挺多的但是这篇文章还没完工,来补一下:

答案等价于求解 \([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);
}