HDU 1525 博弈

Euclid‘s Game

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 1880    Accepted Submission(s): 825

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
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

题意:给出两个正数。

两个人轮流进行操作:

较大的数减掉较小的数的倍数,得到两个非负数。

谁先先把其中一个数减为0的获胜。问谁可以赢。Stan是先手。

假设两个数为a,b(a>=b)

如果a==b.那么肯定是先手获胜。一步就可以减为0,b

如果a%b==0.就是a是b的倍数,那么也是先手获胜。

如果a>=2*b.  那么 那个人肯定知道a%b,b是必胜态还是必败态。如果是必败态,先手将a,b变成a%b,b,那么先手肯定赢。如果是必胜态,先手将a,b变成a%b+b,b.那么对手只有将这两个数变成a%b,b,先手获胜。

如果是b<a<2*b  那么只有一条路:变成a-b,b  (这个时候0<a-b<b).这样一直下去看谁先面对上面的必胜状态。

代码:

/* ***********************************************
Author :rabbit
Created Time :2014/7/4 13:47:33
File Name :3.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
int gcd(int a,int b)
{
    if(a<b) //求出谁大
        swap(a,b);
    if(b==0) //终止 必输状态
        return 0;
    if(a>2*b) //必胜
        return 1;

    return gcd(b,a%b)^1; //和拿了之后的输赢情况相反
}
int main()
{
     //freopen("data.in","r",stdin);
     //freopen("data.out","w",stdout);
     int a,b;
	 while(cin>>a>>b){
		 if(!a&&!b)break;
		 int ans=gcd(a,b);
		// cout<<ans<<endl;
		if(ans)puts("Stan wins");
		else puts("Ollie wins");
	 }
     return 0;
}

HDU 1525 博弈,布布扣,bubuko.com

时间: 2024-12-11 07:51:12

HDU 1525 博弈的相关文章

HDU 1525 (博弈) Euclid&#39;s Game

感觉这道题用PN大法好像不顶用了,可耻地看了题解. 考虑一下简单的必胜状态,某一个数是另一个数的倍数的时候是必胜状态. 从这个角度考虑一下:游戏进行了奇数步还是偶数步决定了哪一方赢. 如果b > 2a,那么这一方就有权利改变游戏步数的奇偶性,从而到达对自己有利的状态,所以这是一个必胜状态. 如果a < b < 2a,那么下一步只能到达(b-a, a)状态,一直模拟就行. 1 #include <cstdio> 2 #include <algorithm> 3 us

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

[简单博弈] hdu 1525 Euclid&#39;s Game

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1525 Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1832    Accepted Submission(s): 808 Problem Description Two players, Stan and

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): 2074    Accepted Submission(s): 924 Problem Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan,

hdu 3537(博弈,翻硬币)

题意:给定了每个正面朝上的硬币的位置,然后每次可以翻1,2,3枚硬币,并且最右边的硬币开始必须是正面朝上的. 分析: 约束条件6:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初始编号从0开始. 当N==1时,硬币为:正,先手必胜,所以sg[0]=1. 当N==2时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为2,所以sg[1]=2. 当N==3时,硬币为:反反正,先手必赢,先手操作后可能为:反反反.反正反.正反正.正正反,方案数为4,所以sg[2]=4.

hdu 1848 博弈之SG函数的使用

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题目简单描述为: 1.  这是一个二人游戏;2.  一共有3堆石子,数量分别是m, n, p个:3.  两人轮流走;4.  每走一步可以选择任意一堆石子,然后取走f个:5.  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8-等数量):6.  最先取光所有石子的人为胜者:假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢. 代码为: ? 1 2 3 4 5 6 7 8 9

HDU 2147 (博弈) kiki&#39;s game

无奈英语不好又被坑,看到棋子能左移下移左下移,想当然地以为是Wythoff博弈了,=u= 题的意思是说每次只能选一个方向移动一步,所以找找规律就是横纵坐标为奇数的时候是必败状态. 从http://www.cnblogs.com/chaosheng/archive/2012/05/29/2524725.html 盗过来一张图比较好说明: 1 #include <cstdio> 2 3 int main() 4 { 5 int n, m; 6 while(scanf("%d%d"

hdu 1525 找规律博弈 (根据每一步的必然性以及可选择性决策)

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1525 题意: 给出两个数,a和b,将大的数中,减去若干b的倍数,最终有一个数为0的话就胜了. 分析:  两个数a和b, 不妨设(a > b),总会出现的一个局面是b,a%b,这是必然的,如果a>=b&&a<2*b,那么只有一种情况,直接到b,a%b.否则有多种情况. a / b == 1   即a Ε [b , 2b)  , 下一步 只能到达   (b , a  - b) a

HDU 5996 博弈

http://acm.hdu.edu.cn/showproblem.php?pid=5996 博弈论待补. 这题变化了一下,因为注意到奇数层的东西(层数从1开始),对手可以模仿地动,那就相当于没动. 比如从第5层,我选择去了第4,他去第3,我去2,他去1,结果还是到我.所以只需要把偶数层的东西,拿出来, 就是n个石头的博弈了. 异或起来,判断是否等于0,就可以了.博弈论好差,寒假补. #include <cstdio> #include <cstdlib> #include <