题目大意就是如果石头堆的个数异或以后数字为0,则表示对下一步要取石头的玩家来说,这是一个败局。
先得到所有石头的异或结果 x
再遍历石头堆,判断该石头堆是否能够取走几个以后,变成能够与其他石头堆异或为0的值。
x^num[i]就是x与所有除第i个石头堆的所有堆的异或结果y,即如果将第i个石头堆拿走几个以后,剩下y个,那么这些石头堆的异或结果将成为0。
所以,如果num[i]>=y,count++
#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
long long num[2000];
int n;
int main(){
while(1){
cin>>n;
if(n==0)
break;
long long x = 0;
for(int i=0;i<n;i++){
cin>>num[i];
x=x^num[i];
}
if(x==0){
cout<<0<<endl;
continue;
}
int count=0;
for(int i=0;i<n;i++){
int t = x^num[i];
if(num[i]>t)
count++;
}
cout<<count<<endl;
}
return 0;
}