“东信杯”广西大学第一届程序设计竞赛(同步赛)D 数论只会GCD

版权声明:转载注明下出处就行了。 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;

}

猜你喜欢

转载自blog.csdn.net/LJD201724114126/article/details/84498841