题目

传送门

解法

好妙啊。

\(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;
}

posted on 2020-02-17 16:09  Oxide  阅读(107)  评论(0)    收藏  举报