Game HDU - 3389

原题链接
考察:博弈论
思路:
  发现这种n比较大的,比较难找胜态和败态.像上题一样考虑sg函数打表,但是本题的石子移动是可以移动到其他堆的,本蒟蒻是不会写本题的sg函数().
  这样只能研究A,B的移动方式了,实际有点类似阶梯博弈,可以发现(A+B)%6==3时可以移动A--->B.此时枚举0~5之间的数,有三种情况.

  1. A%6==0 B%6==3(或相反)
  2. A%6==1 B%6==2(或相反)
  3. A%6==4 B%6==5(或相反)
      此时再打表i,枚举i能到哪些地方.以 3 6 9为例,这里的3 6 9实际构成阶梯博弈,3是0层,6是1层.再可以发现凡是%6==2,5,0的,都可以作奇数层.根据阶梯博弈我们只需要^奇数层的石子即可.

Code

#include <iostream>
#include <cstring> 
using namespace std;
int n;
int main()
{
	int T,kcase = 0;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		int res = 0;
		for(int i=1;i<=n;i++)
		{
			int x; scanf("%d",&x);
			if(i%6==2||i%6==5||i%6==0) res^=x;
		}
		if(res) printf("Case %d: Alice\n",++kcase);
		else printf("Case %d: Bob\n",++kcase);
	}
	return 0;
}

posted @ 2021-05-24 18:07  acmloser  阅读(77)  评论(0编辑  收藏  举报