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 }
代码君

 

你可能感兴趣的:(game)