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

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;
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值