#include <iostream>
#include <cstring>
using namespace std;
// 位数
const int N = 30;
// 记录每一位1出现的次数
int num[N];
int main()
{
int T;
cin >> T;
while(T--){
// res为所有数异或的结果
int n, res = 0;
cin >> n;
memset(num, 0, sizeof(num));
for(int i = 1; i <= n; i++){
int x;
int cnt = 1;
cin >> x;
res ^= x;
// 获取每个数字每位数1的情况
while(x){
if(x & 1){
num[cnt]++;
}
cnt++;
x >>= 1;
}
}
// 如果所有数字异或结果为0,那就直接为0
if(res == 0){
cout << 0 << endl;
continue;
}
for(int i = N - 1; i > 0; i--){
// 现在开始找最高位的1的个数
// 如果为偶数就会被抵消掉
// 如果为1先手直接赢
if(num[i] == 1){
cout << 1 << endl;
break;
}
// 如果奇数
else if(num[i] % 2 == 1){
// 如果数字总数为偶数,就可以选0来逼先手多选一个1,这样反而是后手赢
if(n % 2 == 0){
cout << -1 << endl;
break;
}
// 如果总数是奇数就没了
else{
cout << 1 << endl;
break;
}
}
}
}
return 0;
}
蓝桥杯省赛真题异或数列
最新推荐文章于 2023-03-30 19:37:54 发布