版权声明:转载注明下出处就行了。 https://blog.csdn.net/LJD201724114126/article/details/84498841
题目链接:https://ac.nowcoder.com/acm/contest/283/D
题解:我们先假设A>B,首先第一步:判断 B|A(A能整除B),假设成立,直接输出答案,否则,我们计算item=A/B,假设item>1,直接输出答案,为什么呢?因为item>1,故先手的在下一轮可以随意选择要先手还是不先手,那么假如下一轮是先手win或后手win,此时我就可以按照最聪明的方法去win。
再解释下下一轮是代表什么:例如刚开始是10,4,那么下一轮就是 2,4(取到不能再取)。
我们还解释下这个样例:10,4,10/4=2>1,故小西能win,我们知道第二轮是2,4,刚好第二轮2,4是先手win,那么小西能通过做聪明操作使得下一轮还是小西先手,即小西在第一轮10,4我们就取4,留下6,4,使得室友不得不取东西变为2,4(也就是让室友最少取一倍的4),每次都这样去博弈,那就是奇数轮小西能win,偶数轮室友能win。
///我们可以这样看,结果无非就两种,要么就先手能win,要么就后手能win
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
int main()
{
LL x,y;
int ncase;
scanf("%d",&ncase);
while(ncase--){
scanf("%lld%lld",&x,&y);
if(x%y==0||y%x==0){ ///一开始就满足
printf("wula\n");continue;
}
int num=0;
int flag=1; ///wula
LL item;
while(1)
{
num++;
if(x<y) swap(x,y);
item=x/y;
if(x%y==0){ ///此轮就满足了
if(num%2==0) flag=2;
else flag=1;
break;
}
if(item>1){ ///说明此时结果已经确定了,此轮先手的在下一轮想先手就先手
if(num%2==0) flag=2;
else flag=1;
break;
}
else if(item==1){ ///不确定,故继续循环
if(x>=y){
x-=y;
}
else{
y-=x;
}
}
}
if(flag==1) puts("wula");
else puts("mmp");
}
return 0;
}