1.如果当前m为n的整数倍,那么这个人肯定赢了
2.如果现在m / n >= 2 的话。
有方程 m = k*n + z (k为m/n,z为余数),那么现在这个人就可以拿到(n,z)或者(n,n+z)这俩种情况,因为当m / n == 1的时候,拿到的人不能有任何操作,只能拿成(m-n,n),所以接下来谁赢就只能看递归的次数了,然而我要是都能拿到上述俩种情况,那么自己最后拿到的最终递归结果是能被自己控制的。
综上:如果谁先拿到m/n >= 2,直接赢
3.如果现在m / n == 1,那么没有办法,没有什么策略,只能硬着一个一个拿,生死由天
AC代码
#include
inline long long read(){char c = getchar();long long x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}
return x*s;}
using namespace std;
#define NewNode (TreeNode *)malloc(sizeof(TreeNode))
#define Mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const int N = 2e5 + 5;
const long long INFINF = 0x7f7f7f7f7f7f7f;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-7;
const int mod = 1e9+7;
const double II = acos(-1);
const double PP = (II*1.0)/(180.00);
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> piil;
int solve(int n,int m,int ans)
{
if(n == 0 || m == 0 || m % n == 0 || m / n >= 2) return ans;
int a = m-n,b = n;
if(a > b) swap(a,b);
solve(a,b,ans+1);
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
int t;
cin >> t;
while(t--)
{
int n,m;
cin >> n >> m;
if(n > m) swap(n,m);
int ans = solve(n,m,1);
if(ans % 2 != 0) cout << "Stan wins" << endl;
else cout << "Ollie wins" << endl;
}
}