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;
}
原文地址:https://www.cnblogs.com/atmacmer/p/5233340.html