欧几里德的两个后代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”
输入样例
2
25 7
24 15
输出样例
Stan wins
Ollie wins
问题分析:
举个栗子A=32 , B = 14,A和B的辗转相除过程为:
32/14 = 2 ···· 4
14/4 = 3 ···· 2
4/2 = 2 ···· 0
这样情况的特点就是:每一步相处所得的商都大于1,即对每局的初状态(A,B),A > B,都满足:A div B > 1.对于这种情况,我们的策略是取走(A div B - 1)* B , 这样就得到了新状态(A mod B + B , B),接下来,对手就没有选择,只能取走B,剩下( A mod B , B),而这就是下一局的初状态,这样就保证下一局的初状态肯定由自己取。这种情况下先取者(Stan)必胜。
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int c;
cin>>c;
for(int i = 1 ; 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;
}