欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的。给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0。然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利。下面是他们用(25,7)两个数游戏的过程:
Start:25 7
Stan:11 7
Ollie:4 7
Stan:4 3
Ollie:1 3
Stan:1 0
Stan赢得了游戏的胜利。
现在,假设他们完美地操作,谁会取得胜利呢?
输入输出格式
输入格式:
第一行为测试数据的组数C。下面有C行,每行为一组数据,包含两个正整数M, N。(M, N不超过长整型。)
输出格式:
对每组输入数据输出一行,如果Stan胜利,则输出“Stan wins”;否则输出“Ollie wins”
输入输出样例
输入样例#1:
2
25 7
24 15
输出样例#1:
Stan wins
Ollie wins
游戏过程的各个状态 | 辗转相除的过程 | 属于那一局 | 所属情况 |
50 18 | 50/18=2....14 | 第1局的初状态 | 第一种 |
32 18 | 第1局的末状态 | ||
14 18 | 18/14=1...4 | 第2局的初状态 (也是末状态) | 第二种 |
14 4 | 14/4=3...2 | 第3局的初状态 | 第一种 |
10 4 | 第3局的中间状态 | ||
6 4 | 第3局的末状态 | ||
2 4 | 4/2=2...0 | 第4局(结局) |
每一局的初状态是在游戏中必然出现的,而且最后一局只有一个状态,面临最后一局初状态的人就赢得胜利。因此,本题大致思路是,尽量让自己能够去取每一局的初状态,让对手去取每局(除最后一局)末状态。下面分两种情况来实现:
- 每一步相除所得的商都大于1,即对于每局的初状态(A,B)A>B,都满足A div B > 1.
- 某一局的初状态满足A div B = 1.此时无法确保先手必然取得胜利,还需要根据剩余局数具体判断。
具体实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int c;
cin>>c;
for(int i=0;i<c;i++)
{
int m,n;
cin>>m>>n;
if(m<n) swap(m,n);
int f=1;
while(m/n==1&&m%n)
{
int t=m%n;
m=n;
n=t;
f=-f;
}
if(f==1)cout<<"Stan wins"<<endl;
else cout<<"Ollie wins"<<endl;
}
return 0;
}