Euclid's Game题解
这是一道比较简单的博弈论。
我们假设 \(x \ge y\),那么此时可以分两种情况讨论:
- \(x < 2y\)
此时我们只能取走 \(y\) 个石子,那么当前状态的后继即为 \((y,x-y)\)。
- \(x \ge 2y\)
此时设 \(k= \lfloor \frac{x}{y} \rfloor\),那么当前状态的后继状态即为 \((x-ny,y)\),其中 \(n \le k\),这个时候我们可以发现这个状态是必胜态。
考虑证明这个结论,假设 \((x-ny,y)\) 为必败态,那么 \((x,y)\) 就是必胜态,而如果 \((x-ny,y)\) 是必胜态,那么 \((x-(n-1)y,y)\) 就是必败态,这样也可以推出 \((x,y)\) 是必胜态。
这样的话,我们只需进行递归求解即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int f=1,w=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
w=(w<<1)+(w<<3)+(c^48);
c=getchar();
}
return f*w;
}
int x,y;
int dfs(int x,int y){
if(x>=2*y||x==y){
return 1;
}
return !(dfs(y,x-y));
}
signed main(){
while(cin>>x>>y){
if(x==0&&y==0) break;
if(x<y) swap(x,y);
int fl=dfs(x,y);
if(fl) printf("Stan wins\n");
else printf("Ollie wins\n");
}
return 0;
}