题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1850
思路:
1.Nim游戏的N-position(即先手必胜态)为 n n n堆石子的异或和不为0;
2.反之必败态为 n n n堆石子的异或和为0,那么就需要给对手创造必败态;
3.遍历每一堆扑克牌,假设当前堆扑克牌数量为 a a a,算出其它 n − 1 n-1 n−1堆扑克牌数量的异或和为 b b b,我们需要做的即让 a = b a=b a=b,此时所有扑克牌异或和为 a ⨁ b = 0 a\bigoplus b=0 a⨁b=0,而我们知道只有 a > b a>b a>b时,我们拿走 a − b a-b a−b张牌,才有可能使得 a = b a=b a=b;
代码:
#include<iostream>
using namespace std;
int a[105];
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
int n;
while(scanf("%d", &n) && n) {
int sum = 0, ans = 0;
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum ^= a[i];
}
for(int i = 0; i < n; i++) {
if((sum ^ a[i]) < a[i]) ++ans;
}
printf("%d\n", ans);
}
return 0;
}