• POJ 2348 Euclid's Game(简单博弈)


    这道题没说a b最大多少,所以要声明为long long型,不然会WA!

    道理很简单,(默认a>=b)a和b只有以下三种关系:

          1.a%b==0 :这种关系下,可能是a/b为整数,也可能是a和b都为0,不论哪种,都会是先者胜;

          2.a<2*b :这种关系下,下一步只能变成(a-b,b),故胜的几率是交替的(cnt++);

          3.a>2*b :这种关系下,下一步总能变成(a,a%b)和(a,a%b+b)两种状态,而这两种状态又与第2种状态(a<2*b)相邻,故两种状态中必有一种处于必败状态,只要先者找到该状态即可,所以不论怎样,在这种关系下,先者一定胜。

     

    #include<iostream>
    #include<cstdio>
    using namespace std;
    typedef long long ll;
    
    int main()
    {
        ll a,b;
        while(scanf("%I64d%I64d",&a,&b)&&a+b)
        {
            int cnt=0;
            while(1)
            {
                if(a<b) swap(a,b);
                if(a%b==0||a>(2*b))
                    break;
                a-=b;
                cnt++;
            }
            if(cnt%2==0)
            //a%b==0||a>(2*b)时Stan必胜,但在break前是Ollie必胜,那时cnt为偶
                printf("Stan wins
    ");
            else printf("Ollie wins
    ");
        }
        return 0;
    }
  • 相关阅读:
    Alpha版使用说明
    团队绩效评估计划
    丹佛机场行李处理系统分析
    第一个Spring冲刺周期团队进展报告
    用户体验
    总结
    Beta版
    Alpha版使用说明书
    5-26课堂作业——组员投票Alpha版存在的问题
    冲刺周期二--站立会议07
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5233340.html
Copyright © 2020-2023  润新知