题目
解法
好妙啊。
设 \(n\) 大于 \(m\)。
首先,如果 \(n\) 与 \(m\) 存在倍数关系肯定是先手嬴。
多举几个例子就会发现,面临 \(n\ge 2m\) 的选手必胜。
证明就是设 \(n\bmod m=r\)。那么他可以将局面变成 \(m,r\) 或 \(r+m,m\)。
而对于第二种局面,在下一轮另一选手只能变成 \(m,r\),因为题目要求减去 正整数 倍。
这两种局面等同,且两种局面的面对者不一样,而局面必有一个胜者。所以面临 \(n\ge 2m\) 的选手必胜。
对于其他情况即 \(m<n<2m\),容易发现只有一种方案,而且每次较大值至少减半,所以直接模拟即可。
代码
#include<cstdio>
#include<iostream>
using namespace std;
#define int long long
int n, m, ans;
int read() {
int x = 0, f = 1; char s;
while((s = getchar()) > '9' || s < '0') if(s == '-') f = -1;
while(s >= '0' && s <= '9') {
x = (x << 1) + (x << 3) + (s ^ 48);
s = getchar();
}
return x * f;
}
signed main() {
while(n = read(), m = read(), n && m) {
ans = 0;
if(n > m) swap(n, m);
while(n) {
if(m % n == 0 || m >= (n << 1)) break;
m -= n; swap(n, m);
ans ^= 1;
}
puts(ans ? "Ollie wins" : "Stan wins");
}
return 0;
}