CCF 1040. 除法游戏

免责声明:这道题的评测系统有BUG,有些样例用我的代码可能过不了,但我的思路以及代码是能AC通过此题的。

而且比较坑人的是:如果你用的是int类型的变量,可能只会得80分(我一开始也是这样),但一定要改成long long类型的,unsigned long long 没有必要但也可以用

| 思路

回归正题,这道题首先运用了最大公约数(辗转相除法求两个数的最大公约数,具体请见:https://www.cnblogs.com/elisa02/p/12784945.html)

辗转相除法求两个数的最大公约数代码:
long long gcd(long long m, long long n){ if(n == 0){ return m; }else{ return gcd(n,m%n); } }

最大公约数有个性质:两个数的最大公约数里包含了所有的共有的因子。可是这道题要求的是a是否包含了b的所有因子。即一个数除了最大公约数外还有别的因子,

比如,12和18的最大公约数是6,要看12是否包含了18的所有因子,18 / 6(18除了6以外还有一个因子3)= 3,要看6里是否也包含这个3就可以了,所以代码是:

c = gcd(a,b);//c就是例子里的6 
b = b / c;//b赋值完以后就是3 
if(c % b == 0){
    cout << "Yes" << endl;
}else{
    cout << "No" << endl;
}

 

| 代码

完整版代码:

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;

long long gcd(long long m, long long n){
    if(n == 0){
        return m;
    }else{
        return gcd(n,m%n);
    }
}

int main(){
    long long a,b,c;
    cin >> a >> b;
    c = gcd(a,b);//c就是例子里的6 
    b = b / c;//b赋值完以后就是3 
    if(c % b == 0){
        cout << "Yes" << endl;
    }else{
        cout << "No" << endl;
    }
    return 0;
}
上一篇:PAT乙级1040题解


下一篇:PAT高效技巧算法---1040 有几个PAT (25分)