洛谷1290欧几里得的游戏

题目:https://www.luogu.org/problemnew/show/P1290

考虑两个数的位置变化的时候。

赢,除了一开始就整除(别忘了判断这个!),就只会发生在两个数的位置一变化的时候。

自己只要保持每次自己都是变化后的先手就行了。

就是保证对方的情况一定是只能n中最多取1个m,这样对方只能取这个m,取完后n<m,位置变动。

但是自己一开始就只能取一个m的情况也不一定必输,因为下一步对方也许也还是只能取一个m。要while判断一下。

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
ll c,n,m;
int main()
{
    scanf("%lld",&c);
    while(c--)
    {
        scanf("%d%d",&n,&m);
        if(n<m)swap(n,m);
        if(n>=2*m||n%m==0)printf("Stan wins\n");//>=和n%m==0!!! 
        else
        {
            bool cnt=1;
            while(1)
            {
                n-=m;swap(n,m);
                if(n>2*m||n%m==0)
                {
                    if(cnt)printf("Ollie wins\n");
                    else printf("Stan wins\n");
                    break;
                }
                cnt=!cnt;
            }
        }
    }
    return 0;
}

 

posted on 2018-05-22 18:11  Narh  阅读(108)  评论(0编辑  收藏  举报

导航