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;
    }
  • 相关阅读:
    Java: 数据类型
    数据结构是什么
    数据结构:进制转换
    数据结构:堆与栈
    class的写法
    Java:异常体系
    数据结构: 先进后出——堆栈
    tomcat:web容器
    Windows: Dos命令
    面向函数范式编程
  • 原文地址:https://www.cnblogs.com/atmacmer/p/5233340.html
Copyright © 2011-2022 走看看