题目描述
Simon和Antisimon在玩石子游戏。
共有n颗石子,Simon先拿。
Simon能拿当前n和a的最大公约数,Antisimon能拿当前n和b的最大公约数。
当有一个人不能拿时(n=0)那个人就输了。
求谁赢了。
输入输出格式
输入格式
一行,a,b,n(1<=a,b,n<=100)
输出格式
一行,如果Simon赢了,输出0;Antisimon赢了,输出1.
说明
gcd(0,x)=gcd(x,0)=x;
对于样例1:
Simon拿gcd(3,9)=3颗
Antisimon拿gcd(5,6)=1颗
Simon拿gcd(3,5)=1颗
Antisimon拿gcd(5,4)=1颗
Simon拿gcd(3,3)=3颗
Antisimon输了
感谢@引领天下 提供的翻译
输入输出样例
输入样例#1:
3 5 9
输出样例#1:
0
输入样例#2:
1 1 100
输出样例#2:
1
题目地址: https://www.luogu.org/problemnew/show/CF119A
个人思路:
- 这道题是一道gcd的模板题
- 首先,写一下gcd的方法
- 然后,写一下输入输出和相关逻辑判断即可
#include<cstdio>
#include<iostream>
using namespace std;
int gcd(int a,int b){
if(a<b)swap(a,b);
if(b==0)return a;
return gcd(b,a%b);
}
int main(){
int a,b,n;
cin>>a>>b>>n;
bool nowPerson=false;
//true:最后成功拿石子的是Simon
//false:最后成功拿石子的是Antisimon
while(n){
if(!nowPerson){//如果该Simon拿了
if(gcd(n,a)>n){
break;//无法拿石子
}
n-=gcd(n,a);
nowPerson=true;
}else{//如果该Antisimon拿了
if(gcd(n,b)>n){
break;//无法拿石子
}
n-=gcd(n,b);
nowPerson=false;
}
}
if(nowPerson){
cout<<0<<endl;
}else{
cout<<1<<endl;
}
return 0;
}