首页 > 其他 > 详细

HDU 1525 (博弈) Euclid's Game

时间:2015-04-13 22:16:30      阅读:237      评论:0      收藏:0      [点我收藏+]

感觉这道题用PN大法好像不顶用了,可耻地看了题解。

考虑一下简单的必胜状态,某一个数是另一个数的倍数的时候是必胜状态。

从这个角度考虑一下:游戏进行了奇数步还是偶数步决定了哪一方赢。

如果b > 2a,那么这一方就有权利改变游戏步数的奇偶性,从而到达对自己有利的状态,所以这是一个必胜状态。

如果a < b < 2a,那么下一步只能到达(b-a, a)状态,一直模拟就行。

技术分享
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int a, b;
 8     while(scanf("%d%d", &a, &b) == 2 && a + b)
 9     {
10         int step = 0;
11         if(a > b) swap(a, b);
12         if(a == 0) { puts("Ollie wins"); continue; }
13         while(!(b % a == 0 || b > a * 2))
14         {
15             b -= a;
16             swap(a, b);
17             step++;
18         }
19         printf("%s\n", step & 1 ? "Ollie wins" : "Stan wins");
20     }
21 
22     return 0;
23 }
代码君

 

HDU 1525 (博弈) Euclid's Game

原文:http://www.cnblogs.com/AOQNRMGYXLMV/p/4423262.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!