[poj2348]Euclid's Game(博弈论+gcd)

本文介绍了一个基于欧几里得算法的两人博弈游戏——欧几里得游戏。玩家通过减法操作来使对手无法继续游戏而获胜。文章详细分析了游戏策略,包括如何通过计算最大公约数(GCD)来决定胜负,并提供了一段C++实现代码。
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 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

Source

 
 
老师的惊天模拟赛#1
 
TAT我天真的以为我会这道题了
很容易想到对于两堆数字,只有两种决策:拿一个或者拿多个
对于a>b且a<2*b的情况,只能拿一种,因此可以确定先后手
当可以拿多次时,要么全取走能取走的,要么再留下一次能取的量
所以对两个数做一次gcd
每次取模前判断可以取几次数字,得到一个序列仅包含1和2
(我只想到这里)
(话说讲博弈论的时候我好像睡着了怪不得)
对于连续的1,可以立刻判断结尾先手还是后手
但对于一个2,只要有一方遇到了2,他就可以操纵局势
即在2结束后,他一定可以让自己位于序列结尾或下一个2
那么在gcd的时候,只需记录出现第一个2的时候是先手还是后手即可
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define LL long long
 6 int main(){
 7     int tmp,n,m,pl;
 8     while(scanf("%d %d",&n,&m)!=EOF&&(n&&m)){
 9         pl=0;
10         while(n&&m){
11             if(m<n){tmp=m;m=n;n=tmp;}
12             if((n<<1)>0&&m>=(n<<1))break;
13             m=m%n;
14             if(!m)break;
15             pl^=1;
16         }
17         if(!pl)puts("Stan wins");
18         else puts("Ollie wins");
19     }
20     return 0;
21 }
View Code

 

转载于:https://www.cnblogs.com/Pumbit-Legion/p/5962614.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值