用c++实现又有一天,又是dp小王子又是偷偷摸摸的找到了松哥:有两个数p,q,已知他们的最大公约数是x,最小公倍数是y,你知道一共有几组(p,q)满足条件嘛?松哥又要向你请教了。
时间: 2024-03-23 08:41:15 浏览: 53
这个问题可以使用数学知识和辗转相除法来解决。我们知道,两个数的最大公约数等于它们的公共因子中的最大值,最小公倍数等于它们的公共因子中的最小值。因此,如果我们知道了x和y,就可以求出它们的公共因子,然后用这些公共因子去分别除p和q,得到所有满足条件的(p,q)。
具体地,我们可以先用辗转相除法求出x和y,然后用x去除y,得到它们的最简公共因子z。接下来,我们可以求出z的所有因子,然后用每个因子去分别除p和q,得到所有满足条件的(p,q)。代码实现如下:
```c++
#include <iostream>
#include <vector>
using namespace std;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int main() {
int x, y;
cin >> x >> y;
int z = lcm(x, y) / x;
vector<int> factors;
for (int i = 1; i * i <= z; i++) {
if (z % i == 0) {
factors.push_back(i);
factors.push_back(z / i);
}
}
if (z * z == lcm(x, y)) factors.pop_back();
int count = 0;
for (int factor : factors) {
if (gcd(factor, z) == 1) {
count++;
}
}
cout << count * 2 << endl;
return 0;
}
```
这段代码首先求出了x和y的最小公倍数z,然后求出了z的所有因子,接着判断每个因子是否和z互质,最后将满足条件的因子个数乘以2即可得到答案。
阅读全文