题目链接:这里
题意:最初有n堆石子,每堆石子个数已知。两人轮流执行操作,如果当某人无法执行有效操作时即输。操作分两步: 第一步为:选择其中一堆石子假定石子个数为a,拿走个数不为0的一些石子使得该堆石子剩余k个并且保证(0 < k < a,k^a < a),^为异或符号。第二步为:加入一堆新的石子,石子个数为k^a,当然你也可以使用技能使得加入的石子个数变为(2k)^a。不过每个人每局游戏只能使用一次技能。无法执行有效操作即第一步或者第二步无法执行时。
解法:
如果所有石头数的二进制中1的总个数是奇数且n为偶数 胜
如果所有石头数的二进制中1的总个数是偶数且n为奇数 胜
其他情况 败
//HDU 4388
#include <bits/stdc++.h>
using namespace std;
int main(){
int T, n, ans, ks = 0;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
ans = n;
for(int i = 1; i <= n; i++){
int x; scanf("%d", &x);
ans += __builtin_popcount(x);
}
if(ans&1) printf("Case %d: Yes\n", ++ks);
else printf("Case %d: No\n", ++ks);
}
return 0;
}