题意:
两个人博弈, 规定 n堆石子, 一次取某一堆最少一个, 取最后一个获胜,规定 d = 1 先手先取,d = 2 后手先去,
并且先手每次去能连续取两次.现在给你d 和 n 问 先手是否能赢.
思路:
对于三人博弈,两人一伙这种类型的问题,与3的倍数有关系,
当先手先取时: 当 n %3 ==0 并且 每一堆都为1 的时候 先手必输,否则必赢.
当后手先取时: 当 1的堆数 是 n - 1 并且 n %3 = 1 或 0 时 或者 1的堆数是 n 并且 n %3 = 1 先手必输.
代码:
#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 1e5 +20;
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int x;
int sum = 0;
if( m == 1)
{
for(int i = 1 ;i <=n;i++)
{
cin>>x;
if(x==1)
sum++;
}
if( sum%3 ==0 && sum ==n)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
else
{
for(int i = 1 ;i <=n;i++)
{
cin>>x;
if(x==1)
sum++;
}
if( ( sum==n && sum%3 == 1) || ( (sum+1==n)&&( n%3>=0 && n%3 <2) ) )
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
return 0;
}