【题意】
有T组数据,每组数据输入一个n,d,n为石子堆的数目,d为1表示Hakase先取,2表示Nano先取,然后输入n个数据表示第i堆石子有ai个石子,一次只能去一堆任意个石子切最少取一个,Hakase每次必须取两次,Nano每次必须取一次。Hakase赢就输出Yes否则输出No。
【解题思路】
5555第一次做出博弈真是太感人了。
当H先手时,手动模拟可以发现只有n是3的倍数,且ai都为1的情况H才会输。
当N先手时,因为N想赢所以肯定想转换到上述H会输的状态,所以H在n是3的倍数,且有n-1个数为1时会输(这时N只需从不是1的那堆石子里拿掉一些石子使状态变为1 1 1),或者n是3的倍数余1,且n个数为1时会输(此时N只需拿掉一堆石子,H就到了必输态),或者n是3的倍数余1,且n-1个数为1时会输(此时N只需拿掉一堆不是1的石子,H就到了必输态)。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,d,cnt=0;
scanf("%d%d",&n,&d);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]==1)cnt++;
}
if(d==1)
{
if(n%3==0 && cnt==n)
printf("No\n");
else printf("Yes\n");
}
else
{
if((cnt==n && n%3==1) || (cnt==n-1 && n%3==1) || (cnt==n-1 && n%3==0) )
printf("No\n");
else printf("Yes\n");
}
}
return 0;
}