#include <bits/stdc++.h>
using namespace std;
long long f[60][100010][2];
int tot[60][100010];
long long x[100010],c[100010],n,m;
long long lim,S,T;
inline int read()
{
char c=getchar();int x=0,flag=1;
while(!isdigit(c)){if(c=='-') flag=-1;c=getchar();}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*flag;
}
long long dfs(int x,int y,int z)
{
if(x==m+1) return z==0;
if(~f[x][y][z]) return f[x][y][z];
long long &ans=f[x][y][z];
ans=0;
int shangling=tot[x][y];
int shangyi=y-shangling;
int xiayi=tot[x][n]-tot[x][y];
int xialing=n-y-xiayi;
int t=(S>>x-1)&1;
if(((shangyi+xiayi)&1)==t) ans+=dfs(x+1,shangling,lim&(1ll<<x-1)?0:z);
if(((shangling+xialing)&1)==t) ans+=dfs(x+1,shangyi+shangling+xiayi,lim&(1ll<<x-1)?z:1); return ans;
}
long long calc(long long x)
{
lim=x-1;
memset(f,-1,sizeof(f));
return dfs(1,0,0);
}
int main()
{
n=read(),m=read();
long long start=0;
cin>>S>>T;
for(int i=1;i<=n;i++)
cin>>x[i],start^=x[i];
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
tot[i][j]=tot[i][j-1]+((x[j]>>i-1)&1);
}
int cnt=0;
for(int j=1;j<=n;j++)
{
if(x[j]&(1ll<<i-1))
c[++cnt]=x[j];
}
for(int j=1;j<=n;j++)
{
if(!(x[j]&(1ll<<i-1)))
c[++cnt]=x[j];
}
for(int j=1;j<=n;j++)
swap(c[j],x[j]);
}
long long tim=T>>m;
cout<<calc(1ll<<m)*tim+calc(T-(tim<<m)+1)-(S==start);
return 0;
}
来源:zr