poj 2348 Euclid's Game

题目:

给两个整数a和b,两个人先后用较大的数减去较小数的整数倍,并且保证相减后为非负数。先把一个数变为0的人获胜。

分析:

很显然,当大数是小数的整数倍时为必胜态。

从这道题学会一个叫做自由度的东西,感觉能够为博弈推理提供思路。

博弈基本就是一个推理必胜态和必败态的过程。自由度越低越好推理。

不妨假设b为两个数中的较大数。

如果b-a<a

那么只能选择用b去减a,如果后继态是必胜态,那么该状态是必败态,否则就是必胜态。

如果b-a>a呢?

我们怎么能够转移到自由度较低的情况。

假设x是是的b-x*a<a的整数。

那么我们用b减去(x-1)*a。这个就变成了第一种情况,如果第一种情况是必败态,那么此时就是必胜态。

如果减去(x-1)*a是必胜态呢?那么b-a*x是不是就变成了必败态?(有点绕,仔细想想),所以当前状态还是必胜态。

所以就是比谁先达到自由度高的情况即可。

#include<stdio.h>
#include<algorithm>
using namespace std;
int main( )
{
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        if(a==0&&b==0)
        break;

        bool f=true ;
        while(1)
        { if(a>b)
        swap(b,a);
            if(b%a==0)
            break;
            if(b-a>a)
            break;
            b-=a;
            f=!f;
        }
        if(f)
        puts("Stan wins");
        else
        puts("Ollie wins");

    }return 0;
}

 

posted @ 2018-08-29 13:22  shuai_hui  阅读(121)  评论(0编辑  收藏  举报