【HDOJ】1525 Euclid's Game

自己想明白的第一道博弈。
首先a==b的时候肯定是先手赢;

然后当a>=2*b时,不妨假设a=nb+k, k<b,因此,不论后续怎么博弈,一定可以出现a=k, b=b的情况。因此,无论这个局面是胜或负,先手者一定可以得到利于自己的局面。
若(k,b)为负,则先手者从a减去nb,则先手胜;若(k,b)为胜,先手者从a减去(n-1)*b,则先手仍然胜。

当b<a<2*b时,只能对a减去b,然后进入下一轮仍旧按照上述策略博弈。

 1 /* 1525 */
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 
 6 void swap(int &a, int &b) {
 7     int tmp = a;
 8     a = b;
 9     b = tmp;
10 }
11 
12 int main() {
13     int a, b;
14     bool flag;
15     
16     #ifndef ONLINE_JUDGE
17         freopen("data.in", "r", stdin);
18     #endif
19     
20     while (scanf("%d%d",&a,&b)!=EOF && (a||b)) {
21         if (a < b)
22             swap(a, b);
23         flag = true;
24         while (1) {
25             if (a==b || a>=2*b)
26                 break;
27             a -= b;
28             if (a < b)
29                 swap(a, b);
30             flag = !flag;
31         }
32         if (flag)
33             puts("Stan wins");
34         else
35             puts("Ollie wins");
36     }
37     
38     return 0;
39 }
原文地址:https://www.cnblogs.com/bombe1013/p/4256079.html