分析:
比较有意思的一道题。
定义局面为一个二元数
(x,y)
,可以推出以下结论:
1)
(x+y,y)
与
(x,y)
必有一个为必胜态而另一个为必败态,因为
(x+y,y)
可以到达
(x,y)
2)若
x≥2y
则
(x,y)
是必胜态,这是因为它可以到达1)中的两种情况之一(即后继状态存在必败态)
3)若
x=y
,显然
(x,y)
是必胜态
4)若
y<x<2y
,局面
(x,y)
与局面
(y,x%y)
的状态相反
5)若
x==0||y==0
,显然
(x,y)
为必胜态
代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
typedef long long LL;
string ans[2]={"Ollie wins\n","Stan wins\n"};
int judge(LL a,LL b){
if(!b) return 1;
if(a>=2*b||(a==b)) return 1;
return !judge(b,a%b);
}
int main(){
ios::sync_with_stdio(false);
LL n,m;
while(cin>>n>>m,n||m){
if(n<m){
swap(n,m);
}
cout<<ans[judge(n,m)];
}
return 0;
}