欧几里得游戏

Posted chen-1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了欧几里得游戏相关的知识,希望对你有一定的参考价值。

试题描述:

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

开始:25 7

Stan:11 7 {18 7, 11 7, 4 7均有可能}

Ollie:4 7

Stan:4 3

Ollie:1 3

Stan:1 0

Stan最后获得了胜利

现在,假设两个人都能完美地进行操作,谁会取得最终的胜利呢?

输入:

第一行输入测试数据组数C
以下C行,每行一组数据,包含两个正整数M和N,M和N的范围不超过long long范围。

输出:

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

输入输出

2
25 7
24 15

 

Stan wins
Ollie wins

 

 

分析:如果输入中较小的已经为零,则为Ollie wins。如果n<m*2,则只有一种选择——继续递归。如果大的不止一倍,那就有多种选择,简单来说,如果(n%m,m)可以,那就(n%m,m),否则(n%m+m,m),这样下一个人就必输,自己也赢了。

#include<bits/stdc++.h>
using namespace std;
int t, m, n;
bool solve(int n, int m)
{
    if (!m) return false;
    if (n/m==1) return !solve(m, n%m);
    else return true;
}
int main()
{
    scanf("%d", &t);
    for (int i=1;i<=t;i++)
    {
        scanf("%d%d", &n, &m);
        if (solve(max(n,m),min(n,m)))
            printf("Stan wins
");
        else
            printf("Ollie wins
");
    }
}

 






以上是关于欧几里得游戏的主要内容,如果未能解决你的问题,请参考以下文章

AC日记——欧几里得的游戏 洛谷 P1290

从片段调用 Google Play 游戏服务

洛谷 [P1290] 欧几里得的游戏

扩展欧几里得算法(双六游戏)

欧几里德的游戏

洛谷——P1290 欧几里德的游戏