写出C语言代码已知正整数 a0,a1,b0,b1,设某未知正整数 x 满足: 1. x 和 a0 的最大公约数是 a1 2. x 和 b0 的最小公倍数是 b1 求解满足条件的 x 的个数。请你帮助他编程求解这个问题。 对于 100%的数据,保证有 1≤a0,a1,b0,b1≤2,000,000,000。 输入格式: 第一行为一个正整数 n,表示有 n 组输入数据。n≤2000 接下来的 n 行每行一组输入数据,为四个正整数 a0,a1,b0,b1,之间用一个空格隔开。 输出格式: 共n 行。每组输入数据的输出结果占一行,为一个整数。 对于每组数据:若不存在这样的 x,请输出 0; 若存在这样的 x,请输出满足条件的 x 的个数;
时间: 2024-02-24 19:57:17 浏览: 19
这是一道数学问题,需要用到数论中的知识。具体来说,我们需要用到最大公约数和最小公倍数的性质,以及质因数分解的方法。
对于每组输入数据,我们可以先分别计算出 $a0$ 和 $b0$ 的质因数分解,然后根据条件求出 $x$ 的质因数分解,进而求出 $x$。
具体来说,我们可以先求出 $a0$ 和 $b0$ 的质因数分解,然后找到它们共同的质因子,计算它们的最小公倍数 $lcm$ 和最大公约数 $gcd$。如果 $a1$ 不是 $gcd$ 的因子,或者 $b1$ 不是 $lcm$ 的因子,那么不存在满足条件的 $x$,输出 0。否则,我们可以将 $x$ 的质因数分解表示为 $x = gcd \times m$,其中 $m$ 是 $x$ 除以 $gcd$ 后的部分。由于 $x$ 和 $a0$ 的最大公约数是 $a1$,因此 $m$ 和 $a0$ 的最大公约数也是 $a1$。同时,$x$ 和 $b0$ 的最小公倍数是 $b1$,因此 $m$ 和 $b0$ 的最小公倍数也是 $b1$。因此,我们只需要求出满足条件的 $m$ 的个数,然后将其乘以 $a1$,即可得到满足条件的 $x$ 的个数。
最后,我们可以用一个循环依次处理每组输入数据,并输出对应的答案。
以下是完整的 C 代码实现:
```c
#include <stdio.h>
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 count(int a0, int a1, int b0, int b1) {
int d = gcd(a0, b0);
int t = a0 / d * b0;
if (b1 % d || t % a1)
return 0;
int m = t / lcm(a0, b0);
int cnt = 1;
for (int i = 2; i * i <= m; i++) {
if (m % i == 0) {
int p = 1;
while (m % i == 0) {
m /= i;
p++;
}
cnt *= p;
}
}
if (m > 1)
cnt *= 2;
return cnt;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int a0, a1, b0, b1;
scanf("%d%d%d%d", &a0, &a1, &b0, &b1);
int cnt = count(a0, a1, b0, b1);
printf("%d\n", cnt);
}
return 0;
}
```