公平组合游戏
- 由两名玩家交替行动
- 玩家的行动与轮到哪名玩家无关
- 当一方不能行动时直接判负
- Nim游戏定理:当开局a1^a2^...^an-1^an!=0先手胜,否则先手输
证明
- 当遇到所有值为0时,则为必败态,此时所有值的异或和为0
- 若a1^a2^...^an-1^an=k,我们将其中一个二进制位数和k的某个值ai抽出来,将它和k的异或值更新原有的ai,则此时所有值的异或值则为0
- 不断重复上述操作,直到终止,发现开局异或和是否为0,就已经决定胜负
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
int t,a[N];
int main()
{
scanf("%d",&t);
while(t--)
{
int n,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++) ans^=a[i];
if(ans) printf("Yes");
else printf("No");
}
return 0;
}