这道题目有点怪异,就是告诉你每堆的石头个数,还有就是每堆的取石头范围,这和Nim博弈不同,一开始我想成Nim博弈了,后来才发现,Nim博弈是告诉我们几堆石头的个数,然后就是,每次取的范围,而不是每堆的取石头范围!
想了好久,没有想出来,看了别人的题解,也看不懂为什么要这样,后来和同学一讨论,才理解了,就是先利用巴什博弈,求出每堆按照巴什博弈的方法取,剩下的数量,因为巴什博弈中 K*M根本就不影响结果;只有余数影响,然后再利用Nim,
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int t,n,i;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
int sum=0;
for(i=1; i<=n; i++)
{
int x,y;
scanf("%d%d",&x,&y);
sum=sum^(x%(y+1));
}
if(sum==0)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}