首页 > 代码库 > HDU-1851-A Simple Game

HDU-1851-A Simple Game

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1851

题意:n堆石子,分别有M1,M2,·······,Mn个石子,各堆分别最多取L1,L2,·····Ln个石头,两个人分别取,一次只能从一堆中取,取走最后一个石子的人获胜。后选的人获胜输出Yes,否则输出No,

第一行一个数字表示数据有多少组,每组测试数据第一行是一个整数n,表示有n行,然后n行分别是两个整数Mi,Li. 表示第i堆有Mi个石子,一次最多去Li个石子。

 

解法

巴什博弈:只有一堆n个物品,两个人轮流从这对物品中取物,规定每次至少取一个,最多取m个,最后取光着得胜。

很容易想到当n%(m+1)!=0时,先取者必胜,第一次先拿走n%(m+1)个,以后每个回合都保持两人拿走的物品总和为m+1即可。

这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报10个,谁能报到100者胜。


此题可以把每堆石头的取法看作是一个Bash Game,这样只需将每组石头按照Bash Game的取法判断,然后将n堆石头做异或,如果异或的结果不为0,则老师获胜,否则Agrael取胜。 

如果Nim游戏中的规则稍微变动一下,每次最多只能取K个,怎么处理?

方法是将每堆石子数mod (k+1).

 

 

代码

#include<stdio.h>
int main(void)
{
int n,i,a[20],b[20];
int t;
scanf("%d",&t);
while(t--)
{
int s=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",a+i,b+i);
s^=a[i]%(b[i]+1);
}
if(s==0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

HDU-1851-A Simple Game