题目链接:
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;
}