首页 > 代码库 > [poj2348]Euclid's Game(博弈论+gcd)
[poj2348]Euclid'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 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):
an Stan wins.
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 1215 240 0
Sample Output
Stan winsOllie wins
Source
Waterloo local 2002.09.28
老师的惊天模拟赛#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 }
[poj2348]Euclid's Game(博弈论+gcd)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。