题目链接:​​https://vjudge.net/contest/152381#problem/B​

题意:求解NIM博弈先手必胜的方法数。

解题思路:在必胜态时,先手要做的就是拿走某堆石头中的m个,使得XOR变成0。将必败态移给后手,题目就是就是问有多种使得XOR变成0的方法数?

=> (ki - m) ^ (XOR ki) 后面的XOR ^ ki代表所有的异或值以后上ki,即等价于除了ki这堆,其他堆的异或和。

=> ki - m = XOR ^ ki

=>m = ki - XOR^ki

要是m > 0即是 ki > XOR^ki,所原来的问题就换成了求ki > XOR^ki的堆数。

#include <stdio.h>
int a[1010];
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
int SG = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
SG ^= a[i];
}
int cnt = 0;
for(int i = 1; i <= n; i++){
if(a[i] > (SG^a[i])){
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}