免责声明:这道题的评测系统有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; }