题目描述
题解
看题目中的两个条件:
(A+B)%2=1,(A+B)%3=0
,其实可以转化成一个条件:
(A+B)%6=3
。
那么这样的话,如果将每一个点的编号写成
%6
的形式,那么我们发现,1和2可以匹配,3和0可以匹配,4和5可以匹配。同时我们又发现1,3,4这三个点是移动的终点,也就是说不能再向其它的移动,那么我们得出:编号
%6=0,2,5
的点会经过奇数次移动到达1或3或4这三个点。这就变成了一个阶梯博弈问题,只有奇数次的点是有效的,将这些点的权异或起来就可以了。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int T,Case,n,x,ans;
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);ans=0;
for (int i=1;i<=n;++i)
{
scanf("%d",&x);
if (i%6==0||i%6==2||i%6==5) ans^=x;
}
if (!ans) printf("Case %d: Bob\n",++Case);
else printf("Case %d: Alice\n",++Case);
}
}