Problem A. 欧几里德的游戏
时间限制 1000 ms
内存限制 128 MB
题目描述
欧几里德的两个后代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赢得了游戏的胜利。
现在,假设他们完美地操作,谁会取得胜利呢?
输入数据
第一行为测试数据的组数 CC 。下面有 CC 行,每行为一组数据,包含两个正整数 M,NM,N 。 (M,N(M,N 不超过长整型。)
输出数据
对每组输入数据输出一行,如果Stan胜利,则输出“Stan wins”;否则输出“Ollie wins”
样例输入
2
25 7
24 15
样例输出
Stan wins
Ollie wins
思路:
解析:因为每次都是最优化操作,显然当一个人可以有两种选择时,显然,如果奇数倍不赢,偶数倍必赢 即当maxNum/minNum>=2时,那个人必赢,
当一个人只有一次选择时,即m/n=1时,他只能操作,但并不能确定输赢,这时候可以判断什么时候maxNum%minNum=0 eg,7/1 那么他的对手必输。即他必赢
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<math.h>
using namespace std;
void output(bool flag)
{
if(flag)
cout<<"Stan wins"<<endl;
else
cout<<"Ollie wins"<<endl;
}
//解析:因为每次都是最优化操作,显然当一个人可以有两种选择时,显然,如果奇数倍不赢,偶数倍必赢 即当maxNum/minNum>=2时,那个人必赢,
//当一个人只有一次选择时,即m/n=1时,他只能操作,但并不能确定输赢,这时候可以判断什么时候maxNum%minNum=0 即 7/1 那么他的对手必输。即他必赢
bool solve(long long maxNum,long long minNum,long long time)
{
if(maxNum%minNum==0||maxNum/minNum>=2)
return time&1? false :true;//time odd ollie win 偶数 stan win
return solve(minNum,maxNum%minNum,time+1);
}
int main()
{
ios::sync_with_stdio(false);
int c;
cin>>c;
long long m,n;
while(c--)
{
cin>>m>>n;
output(solve(max(m,n),min(m,n),0));
}
return 0;
}