博弈论

58 阅读1分钟

公平组合游戏

  • 由两名玩家交替行动
  • 玩家的行动与轮到哪名玩家无关
  • 当一方不能行动时直接判负

题目链接:(P2197 【模板】nim 游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

  • 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;
}