HDU 1525 (博弈) Euclid's Game

感觉这道题用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 }
代码君

 

posted @ 2015-04-13 20:55  AOQNRMGYXLMV  阅读(132)  评论(0编辑  收藏  举报