2011-12-28 09:47:29
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1907
题意:n堆石子,每次取走其中一堆的任意颗,最后一个取的人败,求判局势。
mark:anti-nim,开始以为很简单,其实很难分析,搞了好久。具体可以参见2009年国家集训队贾志豪的论文。
这里先给出anti-nim的结论:
先手必胜当且仅当:1)sg值为0且不存在一堆sg值大于1;2)sg不为0且存在至少一堆sg值大于1。
代码:
# include <stdio.h>
int main ()
{
int T, n, num, sg, flag ;
scanf ("%d", &T) ;
while (T--)
{
scanf ("%d", &n) ;
sg = 0, flag = 0 ;
while (n--)
{
scanf ("%d", &num) ;
sg ^= num ;
if (num > 1) flag = 1 ;
}
if ((sg == 0 && flag == 0)||(sg && flag)) puts ("John") ;
else puts ("Brother") ;
}
return 0 ;
}