“正确”答案
2025-07-22 16:39:58
发布于:河南
1阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
// 计算最大公约数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
// 分解质因数
vector<int> primeFactors(int n) {
vector<int> factors;
if (n % 2 == 0) {
factors.push_back(2);
while (n % 2 == 0) n /= 2;
}
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) {
factors.push_back(i);
while (n % i == 0) n /= i;
}
}
if (n > 1) factors.push_back(n);
return factors;
}
// 判断x是否满足条件
bool isValid(int x, int a0, int a1, int b0, int b1) {
if (gcd(x, a0) != a1) return false;
if (x * b0 / gcd(x, b0) != b1) return false;
return true;
}
int main() {
int n;
cin >> n;
while (n--) {
int a0, a1, b0, b1;
cin >> a0 >> a1 >> b0 >> b1;
// 条件预处理
if (b1 % a1 != 0) {
cout << 0 << endl;
continue;
}
// 枚举b1的所有约数
vector<int> divisors;
for (int i = 1; i * i <= b1; ++i) {
if (b1 % i == 0) {
divisors.push_back(i);
if (i != b1 / i) divisors.push_back(b1 / i);
}
}
// 统计满足条件的x数量
int count = 0;
for (int x : divisors) {
if (isValid(x, a0, a1, b0, b1)) {
count++;
}
}
cout << count << endl;
}
return 0;
}
这里空空如也
有帮助,赞一个