Hdu 1525 欧几里得博弈
两堆石子每次可以在大堆中取小堆的倍数个石子 第一个拿光某个堆的玩家赢
假设a>=b
必胜状态:a%b==0或a/b>=2 因为当a/b>=2时 当前玩家可以选择将状态转移至 a%b+b或a%b 同时a%b+b可转移至a%b 则这两个状态中必有一个为必胜态
#include<bits/stdc++.h> using namespace std; int main() { int a, b; while (scanf("%d %d", &a, &b) && (a + b)) { if (a < b) { swap(a, b); } if (a % b == 0) { printf("Stan wins\n"); continue; } int k = 0; while (1) { if (a < b) { swap(a, b); } if (a % b == 0 || a / b != 1) { break; } a = a % b; k++; } if (k % 2 == 0) { printf("Stan wins\n"); } else { printf("Ollie wins\n"); } } }
如果是第一个拿光某个堆的玩家输的话
当前游戏的SG值为[a/b-b/a]向下取整