欧几里得游戏

试题描述:

欧几里德的两个后代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
");
    }
}
原文地址:https://www.cnblogs.com/chen-1/p/10033656.html