这个题是最基础的巴什博弈问题
举个例子,如果有50块糖,每次最多拿10块,最少拿1块,这样只要先手取6块糖,则先手必胜,因为之后只要每次对方取M([1,10])块糖,他只需要取(10+1)- M块糖即可,这样对方必定无糖可拿
推广到一般规律,如果一共有X块糖,每次拿糖块数区间处在[1,Y] 这样如果先手能一次拿到(Y+1)*n 块糖的状况则必胜,所以要判断x减去 1到Y 这些数 能否达到这种情况
在数学条件下进行推导,假设Y = 10, 则其中(Y+1)*n 所包含的数字有,11,22,33…… 所以如果一开始不是这些数,先手必定能拿到这些数 于是先手获胜,于是如果起始数不是Y+1 的 n倍,先手必胜 否则,后手必胜
Y为任意数时也可推导出以上结论
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>
#include <cstdlib>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
//假设一共50块糖 规定每次最多拿10个
//第一次拿走6块 之后每次拿走10-对方拿走的数量 便可以保证自己拿完
//谁先拿完谁就胜利转换为 谁先拿到(10+1) 的n倍 谁就胜利了
//也就意味着 谁从10+1 的n倍开始拿 谁就输了
int main(int argc, char** argv) {
int p;
scanf("%d",&p);
for(int i=0;i<p;i++)
{
int n,m;
char temp[10];
scanf("%d%d",&n,&m);
scanf("%s",temp);
if(n<=m)
{
printf("%s\n",temp);
continue;
}
else if(n>m)
{
if(n%(m+1)==0&&strcmp(temp,"Cw")==0)
{
printf("ACSync\n");
continue;
}
if(n%(m+1)==0&&strcmp(temp,"ACSync")==0)
{
printf("Cw\n");
continue;
}
if(n%(m+1)!=0)//数学条件下的优化
{
printf("%s\n",temp);
continue;
}
//如果不是正好的条件下 能否一次拿到m+1的 x倍
// int flag = 1;//这里为什么是一次 可以说是一个玄学问题
// for(int i=1;i<=m;i++)
// {
// if((n-i)%(m+1)==0)
// {
// flag = 0;//能拿到
// break;
// }
// }
// if(flag==0)
// {
// printf("%s\n",temp);
// }
// if(n%(m+1)==0&&strcmp(temp,"Cw")==0)
// {
// printf("ACSync\n");
// continue;
// }
// if(n%(m+1)==0&&strcmp(temp,"ACSync")==0)
// {
// printf("Cw\n");
// continue;
// }
//
}
// printf("%s",temp);
}
//17 (3 -> 4)
//system("pause");
return 0;
}