题目链接:精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
题目解析:
观察到:
0异或某个数不变;
1异或某个数,改变该数。
因此优先考虑(二进制下)最高位的数
首先统计,在给定的数中,各个位数的1的总和有多少个;
从高位到低位,寻找第一个1的数量非0位
若在该位1的数量为偶数,则看下一位(偶数个1与某数异或后该数不变);
若在该位1的数量为1,则谁先抢到1谁赢;
若在该位1的数量为大于1的奇数,对于先手的人来说,0的数量为奇数就抢不到最后一个1,输。
反之则赢
若所有位1的数量均为偶数,则平局。
代码:
//#define local
#include<cstdio>
#include<iostream>
#include<vector>
typedef long long ll;
using namespace std;
int n,t;
int num[25];
void init(){
fill(num,num+25,0);
}
void count(int k){
int now=0;
while(k){
if(k&1)
++num[now];
k>>=1;
++now;
}
}
int result(){
for(int i=24;i>=0;--i){
if(num[i]%2==0)
continue;
else{
if(num[i]==1)
return 1;
else if((n-num[i])%2==0)
return 1;
else
return -1;
}
}
return 0;
}
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
scanf("%d",&t);
int tmp;
for(int i=1;i<=t;++i){
scanf("%d",&n);
init();
for(int j=1;j<=n;++j){
scanf("%d",&tmp);
count(tmp);
}
printf("%d",result());
if(i!=t)
printf("\n");
}
return 0;
}