zoukankan      html  css  js  c++  java
  • 洛谷1290 欧几里得的游戏

    题目描述

    欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0。然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程:

    Start:25 7

    Stan:11 7

    Ollie:4 7

    Stan:4 3

    Ollie:1 3

    Stan:1 0

    Stan赢得了游戏的胜利。

    现在,假设他们完美地操作,谁会取得胜利呢?

    输入输出格式

    输入格式:

    第一行为测试数据的组数C。下面有C行,每行为一组数据,包含两个正整数M, N。(M, N不超过长整型。)

    输出格式:

    对每组输入数据输出一行,如果Stan胜利,则输出“Stan wins”;否则输出“Ollie wins”

    输入输出样例

    输入样例#1:

    2
    25 7
    24 15

    输出样例#1:

    Stan wins
    Ollie wins

    思路

    这个题很难一个一个的模拟,情况简直太多。

    通过一系列的手动数据计算我们可以发现,比如,两个数为15和4,那么该数对可以变成11和4,7和4,3和4三种情况,即该选手有三种选择的余地,而不难发现,奇数个和偶数个选择余地分别结果相同,所以判断这个选手能否胜出,就看他选择的余地是否大于1.

    大数/小数 > 1 赢

    大数mod小数 == 0 赢

    如果以上两种情况都没有出先,则向下一步递归

    #include<iostream>
    using namespace std;
    long long a,b,c;
    int ans;
    void dfs(int x,int y,int s)
    {
        if(x>y)swap(x,y);
        if(y%x==0||y/x>1){ans=s;return;}
        dfs(x,y-x,(s+1)%2);
    }
    int main()
    {
        cin>>c;
        while(c--)
        {
            ans=-1;
            cin>>a>>b,dfs(a,b,0);
            if(ans==0)cout<<"Stan wins"<<endl;
            if(ans==1)cout<<"Ollie wins"<<endl;
        }
    }
  • 相关阅读:
    .NET XmlNavigator with Namespace
    编程要素
    【FOJ】1962 新击鼓传花游戏
    【POJ】1389 Area of Simple Polygons
    【POJ】2482 Stars in Your Window
    【HDU】3265 Posters
    【HDU】1199 Color the Ball
    【HDU】3642 Get The Treasury
    【HDU】4027 Can you answer these queries?
    【HDU】1542 Atlantis
  • 原文地址:https://www.cnblogs.com/thmyl/p/6193031.html
Copyright © 2011-2022 走看看