版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82832759
#include<bits/stdc++.h>
#define ll long long
#define mn 111111
using namespace std;
ll n,m,s,t,d[55],a[mn],p[55],f[55][mn][2],c[55][mn];
inline ll calc(ll x)
{
ll i,j,k,q,z,t=0;
memset(f,0,sizeof(f)); f[0][0][0]=1;
for (i=0;i<m;i++)
for (k=0;k<2;k++)
{
q=d[i]; z=0;
for (j=0;j<=n;j++)
{
if (f[i][j][k])
{
if ((s&p[i])&&(q&1)||!(s&p[i])&&!(q&1))
if (!(x&p[i])&&k) f[i+1][z][1]+=f[i][j][k]; else f[i+1][z][0]+=f[i][j][k];
if ((s&p[i])&&((n-q)&1)||!(s&p[i])&&!((n-q)&1))
if ((x&p[i])&&!k) f[i+1][z+q][0]+=f[i][j][k]; else f[i+1][z+q][1]+=f[i][j][k];
}
if (i&&j<n) if (a[c[i-1][j+1]]&p[i]) z++,q--; else q++;
}
}
for (i=0;i<=n;i++) t+=f[m][i][0];
return t;
}
int main()
{
ll i,j,z,q;
scanf("%lld%lld%lld%lld",&n,&m,&s,&t); z=s;
for (i=1;i<=n;i++) scanf("%lld",a+i),z^=a[i];
p[0]=1; for (i=1;i<=m+1;i++) p[i]=p[i-1]*2;
for (j=0;j<m;j++)
{
for (i=1;i<=n;i++) d[j]+=(a[i]&p[j])>0;
if (j)
{
q=0;
for (i=1;i<=n;i++) if (a[c[j-1][i]]&p[j]) c[j][++q]=c[j-1][i]; for (i=1;i<=n;i++) if (!(a[c[j-1][i]]&p[j])) c[j][++q]=c[j-1][i];
}
else
{
q=0;
for (i=1;i<=n;i++) if (a[i]&1) c[j][++q]=i; for (i=1;i<=n;i++) if (!(a[i]&1)) c[j][++q]=i;
}
}
printf("%lld",t/p[m]*calc(p[m]-1)+calc(t%p[m])-(z==0));
}
来源:zr