感觉这道题用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
时间: 2024-12-15 06:50:43