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