题目描述
小 A 和小 B 是一对好朋友,他们的爱好是研究数字。学过除法之后,他们就发明了一个新游戏:两人各说一个数字分别为 a 和 b,如果 a 能包含 b 的所有质数因子,那么 A 就获胜。但是当数字太大的时候,两个朋友的脑算速度就有点跟不上了。
现在,请你写个程序,来判断胜负吧:输入两个正整数,表示 a 和 b(2 ≤ a, b ≤1018)。如果 a 包含了 b 的所有质数因子,则输出 “Yes”,否则输出 “No”(输出时没有引号)。
输入格式
输入两个正整数 a 和 b,中间用一个空格隔开。
输出格式
如果 a 包含了 b 的所有质数因子,则输出 “Yes”,否则输出 “No”(输出时没有引号)。
样例 1 输入
120 75
样例 1 输出
Yes
样例 2 输入
7 8
样例 2 输出
No
数据范围
2 ≤ a, b ≤ 1018
算法一 ———— 暴力模拟(90分)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
LL a, b;
cin >> a >> b;
for(LL i = 2; i * i <= b; i++) {
if(b % i != 0) continue;
if(a % i != 0) {
cout << "No";
return 0;
}
while(b % i == 0) {
b /= i;
}
}
if(a % b == 0) cout << "Yes";
else cout << "No";
return 0;
}
算法二 ———— 统计次数(100分)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
LL a, b;
cin >> a >> b;
int cnt = 0;
for(LL i = 2; i * i <= b; i++) {
if(cnt >= 5 * 1e7)break;
if(b % i != 0) continue;
if(a % i != 0) {
cout << "No";
return 0;
}
while(b % i == 0) {
b /= i;
}
}
if(a % b == 0) cout << "Yes";
else cout << "No";
return 0;
}