POJ 2348 Euclid's Game (博弈找规律 )

来源:互联网 发布:深圳乐易网络是坑吗 编辑:程序博客网 时间:2024/05/23 00:10

题目链接:http://poj.org/problem?id=2348

题目大意:给两个数,选手轮流对这两个数操作,操作的方式把大的数减去小的数的k倍,k可以是1,得到新的两个数。谁先得到一个0,谁就获胜。


首先可以明确的是,大数小于小数的两倍,那么选手只能直接把大的数减去小的数。否则选手的操作有多种。


如果是第一种情况,那么比赛的结果就一定由下一个状态确定了。

即如果(a-b, b)是必胜态,那么(a,b)就是必败态了,a < 2b。


而如果a  % b == 0的话,对于当前选手而言是必胜的,当然包括了a = 2b.


如果a > 2b 那么其实是必胜的,因为他又可以转化为第一种情况,x < 2y。这里如果(x, y)是必败的,那么就转化为(x,y),让对手处于劣势,否则转化为(x-y, x)。

所以问题的关键在于谁抢到了后两种情况中的一种。模拟情况即可。

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;int main () {    int a, b;    while (scanf("%d%d", &a, &b), a&&b) {        bool flag = 1;        while(1) {            if(b < a) {                swap(a, b);            }            if(b % a == 0) {                break;            }            if(b - a > a) {                break;            }            b -= a;            flag = !flag;        }        printf("%s", flag?"Stan wins\n":"Ollie wins\n");    }    return 0;}


0 0
原创粉丝点击