题目链接:http://poj.org/problem?id=2975
题目大意:就是要求nim博弈游戏中,对于当前的局势,有几种方法可以得到必胜态。
解:其实就是要得到所有值异或为0的情况。假设其中一堆有x个石子,取掉若干个后剩下k个,若a^b^……^s^k=0,那么k = a^b^……s,所以只需要取走x-k个(x>k)就可以了。
可以通过a^b^……s^x^x得到a^b^……s。所以一开始只要求一次总的异或就可以了。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int main () {
int n, arr[1005];
while(~scanf("%d",&n), n) {
int cnt = 0, k = 0;
for (int i = 0; i < n; i ++) {
scanf("%d", arr + i);
k ^= arr[i];
}
for (int i = 0; i < n; i ++) {
if((k ^ arr[i]) < arr[i]) {
cnt ++;
}
}
printf("%d\n", cnt);
}
}