zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    JUnit手记
    Guava手记
    深表浅表拷贝
    异常问题仓库
    记录一次“记录超长”
    高二数学微课堂[教学视频]
    高一数学微课堂[教学视频]
    用导数研究函数的性质
    均值不等式的常见使用技巧
    一元二次方程根的分布
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5233340.html
Copyright © 2011-2022 走看看