n为M二进制保留最高位,分开2部分来异或,大于等于n的 和 小于n的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
#include<cmath>
using namespace std;
int batt[100005];
int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
int a[2];
a[0]=a[1]=0;
int ans=0;
for(int i=0;i<N;i++)
{
scanf("%d",&batt[i]);
if(i<2)
{
ans^=batt[i];
a[i]=batt[i];
}
}
sort(batt,batt+N);
int flag=0;int k=0,b=1;
int m=ceil(log((double)M));
m=1<<m;
for(int i=0;i<N;i++)
{
if(batt[i]>=m)
{k=i;break;}
}
for(int i=0;i<k&&b;i++)
{
for(int j=k;j<N;j++)
{
if((batt[i]^batt[j])>M)
{flag=1;b=0;break;}
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}