《博弈论》欧几里德的游戏

Problem A. 欧几里德的游戏

时间限制 1000 ms
内存限制 128 MB

题目描述

  欧几里德的两个后代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赢得了游戏的胜利。
现在,假设他们完美地操作,谁会取得胜利呢?

输入数据

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

输出数据

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

样例输入

2
25 7
24 15

样例输出

Stan wins
Ollie wins

思路:

解析:因为每次都是最优化操作,显然当一个人可以有两种选择时,显然,如果奇数倍不赢,偶数倍必赢 即当maxNum/minNum>=2时,那个人必赢,
当一个人只有一次选择时,即m/n=1时,他只能操作,但并不能确定输赢,这时候可以判断什么时候maxNum%minNum=0 eg,7/1 那么他的对手必输。即他必赢 

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<math.h>

using namespace std;

void output(bool flag)
{
    if(flag)
        cout<<"Stan wins"<<endl;
    else
        cout<<"Ollie wins"<<endl;
}

//解析:因为每次都是最优化操作,显然当一个人可以有两种选择时,显然,如果奇数倍不赢,偶数倍必赢 即当maxNum/minNum>=2时,那个人必赢,
//当一个人只有一次选择时,即m/n=1时,他只能操作,但并不能确定输赢,这时候可以判断什么时候maxNum%minNum=0 即 7/1 那么他的对手必输。即他必赢
bool solve(long long maxNum,long long minNum,long long time)
{
    if(maxNum%minNum==0||maxNum/minNum>=2)
        return time&1? false :true;//time odd ollie win 偶数 stan win
    return solve(minNum,maxNum%minNum,time+1);
}

int main()
{
    ios::sync_with_stdio(false);
    int c;
    cin>>c;
    long long m,n;
    while(c--)
    {
        cin>>m>>n;
        output(solve(max(m,n),min(m,n),0));
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/Look_star/article/details/109345972