Euclid's Game(poj2348+博弈)

B - Euclid‘s Game

Time Limit:1000MS     Memory Limit:65536KB     64bit
IO Format:
%I64d & %I64u

Submit Status Practice POJ
2348

Appoint description: 
System Crawler  (2015-08-02)

Description

Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then
Ollie, the second player, does the same with the two resulting numbers, then Stan, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with
(25,7):

 25 7
 11 7
 4 7
 4 3
 1 3
 1 0

an Stan wins.

Input

The input consists of a number of lines. Each line contains two positive integers giving the starting two numbers of the game. Stan always starts.

Output

For each line of input, output one line saying either Stan wins or Ollie wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.

Sample Input

34 12
15 24
0 0

Sample Output

Stan wins
Ollie wins

题目大意:

给两个数,两人依次取,规则是:每次从大的数那取(两数目相等时任选其一),取的数目只能为小的数的正整数倍。最后取完其中一个数的胜。问给定情况下先手胜负情况。

分析:

现有状态(x,y) (设x>0且y>0,其它情况自行考虑)

(1)当x==y时,显然先手胜

(2)不妨设x<y

那么(x+y,y)的下一步必定为(x,y),所以(x+y,y)和(x,y)的结果必然

相反,其中有一种状态可以先手胜,另一种后手胜

对于任意k>=2,状态(x+ky,y)可以通过从x+ky那堆去掉(k-1)y个石子

变成(x+y,y),也可以通过从x+ky那堆去掉ky个石子变成(x,y),

于是这两种选择(注意:这是自主的选择)必然有一种可以获胜,

所以当k>=2时(x+ky,y)必胜        注意这里的数据范围要用long long

转载请注明出处:寻找&星空の孩子

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

#include<stdio.h>
#include<algorithm>
#define LL long long
using namespace std;
LL cnt;
void fun(LL x,LL y)
{
    cnt++;
    if(x==y||x>=2*y)
        return ;
    else fun(y,x-y);
}
int main()
{
    LL n,m;
    while(scanf("%lld%lld",&n,&m),n+m)
    {
        cnt=0;
        if(n<m)swap(n,m);
        fun(n,m);
        if(cnt%2!=0) printf("Stan wins\n");
        else printf("Ollie wins\n");
    }
    return 0;
}

还有一种更加睿智的思路:

http://www.cnblogs.com/goodness/archive/2010/03/05/1678892.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

Euclid's Game(poj2348+博弈)

时间: 2024-10-13 22:51:06

Euclid's Game(poj2348+博弈)的相关文章

POJ 2348 Euclid&#39;s Game(博弈)题解

题意:有a,b两个数字,两人轮流操作,每次可以选择两个之中较小的数字,然后另一个数字减去选择数字的任意倍数(不能减到负数),直到其中一个为0,不能操作为败 思路:这题用博弈NP思想,必败点和必胜点之间的转化. 我们假设当前状态为(x,y)其中x>=y,那么必有以下任一状态: 1. x < 2 * y:那么这是只能执行一个操作x - y,如果这个操作之后变成必败态,那么当前为必胜态:反之亦然. 2. x >= 2 * y:显然此时有多种选择,假设x = k * y,如果x - (k - 1

hdu1525 Euclid&#39;s Game , 基础博弈

http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 两人博弈,给出两个数a和b, 较大数减去较小数的任意倍数,结果不能小于0,将两个数任意一个数减到0的为胜者. 题解: 假设a大于b a == b.  N态 a%b == 0. N态 a >= 2*b,先手能决定谁取(b,a%b),并且知道(b,a%b)是P态还是N态.    N态 b<a<2*b, 只能 -->(b,a-b) , 然后再进行前面的判断. #include<cs

UVA 10368 - Euclid&#39;s Game(数论+博弈)

10368 - Euclid's Game 题目链接 题意:Stan和Ollie玩游戏,有两个数字a,b,每次可以选择较小数字的倍数,把另一个数字-去这个数,要保证>= 0,最后谁那步能得出0谁就赢了,问谁会赢. 思路:其实这个相减的过程就是一个辗转相除的过程,考虑每一次辗转相除,如果只有1倍的数可以减,那么必须到下一步,如果有多步,先手的就有机会选择是自己到下一步或者让对方到下一步,这样先手的就必胜了,于是利用辗转相除,求出谁能先掌控局面,就是谁赢了. 代码: #include <stdio

HDU1525(Euclid&#39;s Game)规律博弈

Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number

poj2348(博弈)

poj2348 给定两个数a,b,大的数能减少小的数的倍数,不能是的数小于0,谁先使得数等于0,谁就赢了 有三种情况 ① a % b ==0  这个状态是必胜的 ② a - b < b  这个状态是必胜还是必败,关键在于下一个状态是必胜还是必败 ③ a - b > b 这个状态一定是必胜的,这个状态可以看做是a - xb < b 如果a-(x-1)b是比败的,那么a-xb是必胜的,  如果a-(x-1)b是必胜的,那么a-xb是必败的 所以第三种状态一定是必胜的. 所以谁先走到第一种和第

hdu1525 Euclid&amp;#39;s Game , 基础博弈

http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 两人博弈,给出两个数a和b, 较大数减去较小数的随意倍数.结果不能小于0,将两个数随意一个数减到0的为胜者. 题解: 如果a大于b a == b.  N态 a%b == 0. N态 a >= 2*b,先手能决定谁取(b,a%b),而且知道(b,a%b)是P态还是N态.    N态 b<a<2*b, 仅仅能 -->(b,a-b) , 然后再进行前面的推断. #include<c

hdu 1525 Euclid&#39;s Game 博弈

Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2219    Accepted Submission(s): 1000 Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan

POJ 2348 Euclid&#39;s Game(博弈)

题目地址:POJ 2348 每一步只有如下三种情况:(假设a>=b) 1:a%b==0    这时候自然是必败态. 2:a<2*b  这时候的下一步是别无选择的,只能是变为(a-b,a),由于该步是唯一的,所以必胜态与必败态是交替的. 3:a>2*b  这时候是必胜态.为什么呢?因为此时总可以转移到一个必败态.由于第2情况的时候两种状态是交替的,而这时候由总可以转换成(a,a%b)和(a,a%b+b),而(a,a%b+b)与(a,a%b)又属于第2种情况的相邻的,所以必有一个是必败态.根

[poj2348]Euclid&#39;s Game(博弈论+gcd)

Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9033   Accepted: 3695 Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser o