应该是博弈论 但我还没学 这题有点水。
n m (a>b)
1 n是m的倍数 那么这种情况下取的人赢了
2 接下来我们考虑一下走到哪部就稳操胜券了 首先你必须取 m个或者大于m并且是m的倍数,那么我们考虑2m个特殊边界,n>2m 举个例子n=2.5m 我只要取到1.5m 换你取 1.5m > m 你必须要取m 还剩0.5m m>0.5m 那么 我只要取完剩下的0.5m 你就GG 那么谁先面对这种情况 谁就赢了
3 一般情况 我们各取一个m 慢慢推进吧 反正最后不是人为能决定的了。
代码如下:
// 人比较菜 写的有点最多 应该可以省一些
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+5;
const int mod=1e9+7;
int main()
{
int n,m;
while(cin>>n>>m&&(n!=0||m!=0)){
int ans=1;
while(1){
if(n<m)
swap(n,m);
if(n%m==0){
if(ans%2==1){
puts("Stan wins");
break;
}
else{
puts("Ollie wins");
break;
}
}
if(2*m<n){
if(ans%2==1){
puts("Stan wins");
break;
}
else{
puts("Ollie wins");
break;
}
}
else if(2*m>n)
n-=m;
ans++;
}
}
return 0;
}