题目描述

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;
}