POJ 2348 Euclid's Game <博弈>

来源:互联网 发布:黑客帝国4矩阵复活下载 编辑:程序博客网 时间:2024/05/16 03:49

题目链接

分析
比较有意思的一道题。
定义局面为一个二元数(x,y),可以推出以下结论:
1)(x+y,y)(x,y)必有一个为必胜态而另一个为必败态,因为(x+y,y)可以到达(x,y)
2)若x2y(x,y)是必胜态,这是因为它可以到达1)中的两种情况之一(即后继状态存在必败态)
3)若x=y,显然(x,y)是必胜态
4)若y<x<2y,局面(x,y)与局面(y,x%y)的状态相反
5)若x==0||y==0,显然(x,y)为必胜态

代码

#include <iostream>#include <algorithm>#include <string>using namespace std;typedef long long LL;string ans[2]={"Ollie wins\n","Stan wins\n"};int judge(LL a,LL b){    if(!b) return 1;    if(a>=2*b||(a==b)) return 1;    return !judge(b,a%b);}int main(){    ios::sync_with_stdio(false);    LL n,m;    while(cin>>n>>m,n||m){        if(n<m){            swap(n,m);        }        cout<<ans[judge(n,m)];    }    return 0;}
原创粉丝点击