题意给a,b 每次操作可以使大的数(假设是b)减小a的若干倍即b-ax&&b-ax>=0
Stan先手谁先使得一个数为0谁就获胜
若a|b则 b-ka=0 Stan获胜
分两种情况 b-a<a ,b-a>a
若b-a<a 则只有一个操作即 b-a 若(a,b-a)为必败态,则(a,b)为必胜态,反之同理
若b-a>a 则b可以减去a的若干倍 设x为:b-ax<a
若(a,b-(x-1)a)为必胜态 则(a,b)为必败态 此时因为(a,b-(x-1)a)的下一个状态只能为(a,b-xa)&&该状态为必败态 则此时选择b-ax操作 使得(a,b)为必胜态
若(a,b-(x-1)a)为必败态 则(a,b)为必胜态 此时选择b-(x-1)a操作
综上 状态(a,b) b-a>a总能获胜
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
const int N=5e5+20;
int main()
{
//给a,b 每次操作可以使大的数(假设是b)减小a的若干倍即b-ax&&b-ax>=0
//Stan先手谁先使得一个数为0谁就获胜
//若a|b则 b-ka=0 Stan获胜
//分两种情况 b-a<a ,b-a>a
//若b-a<a 则只有一个操作即 b-a 若(a,b-a)为必败态,则(a,b)为必胜态,反之同理
//若b-a>a 则b可以减去a的若干倍 设x为:b-ax<a
//若(a,b-(x-1)a)为必胜态 则(a,b)为必败态 此时因为(a,b-(x-1)a)的下一个状态只能为(a,b-xa)&&该状态为必败态 则此时选择b-ax操作 使得(a,b)为必胜态
//若(a,b-(x-1)a)为必败态 则(a,b)为必胜态 此时选择b-(x-1)a操作
//综上 状态(a,b) b-a>a总能获胜
int a,b;
while(cin>>a>>b&&a+b)
{
int f=0;
while(1)
{
if(a>b) swap(a,b);
if(b%a==0)
break;
if(b-a>a)
break;
f=!f;
b-=a;
}
if(!f)
puts("Stan wins");
else
puts("Ollie wins");
}
return 0;
}