写出简洁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-01-21 09:19:24 浏览: 17
```c
#include <stdio.h>
// 辗转相除法求最大公约数
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int main() {
int n;
scanf("%d", &n);
while (n--) {
int a0, a1, b0, b1;
scanf("%d%d%d%d", &a0, &a1, &b0, &b1);
int g = gcd(a0, a1); // 求出 a0 和 a1 的最大公约数
if (b1 % g != 0) { // 如果 b1 不是 g 的倍数,说明无解
printf("0\n");
continue;
}
int lcm = a0 / g * a1; // 求出 a0 和 a1 的最小公倍数
int l = b0 / lcm; // 满足条件的最小整数
int r = b1 / lcm; // 满足条件的最大整数
if (l * lcm < b0) l++; // 如果 l * lcm < b0,说明不满足条件,需要加 1
printf("%d\n", r - l + 1);
}
return 0;
}
```
相关问题
编写C语言代码解决下面的问题 已知正整数 a0,a1,b0,b1,设某未知正整数 x 满足: 1. x 和 a0 的最大公约数是 a1 2. x 和 b0 的最小公倍数是 b1 求解满足条件的 x 的个数。请你帮助他编程求解这个问题。
下面是一份 C 语言代码,用于解决这个问题:
```c
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int main() {
int a0, a1, b0, b1;
int x, count = 0;
scanf("%d%d%d%d", &a0, &a1, &b0, &b1);
for (x = 1; x <= b1 / a1; x++) {
if (gcd(x, a0) == a1 && lcm(x, b0) == b1) {
count++;
}
}
printf("%d\n", count);
return 0;
}
```
代码中使用了 `gcd` 函数求最大公约数,使用了 `lcm` 函数求最小公倍数。在 `main` 函数中,通过循环枚举所有可能的 $x$,并检查它们是否满足条件。如果满足条件,则将计数器增加 1。最终,程序输出满足条件的 $x$ 的个数。
注意,这个算法的时间复杂度为 $O(b_1 / a_1)$,如果 $b_1$ 和 $a_1$ 的差距比较大,那么程序的运行时间可能很长。
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。
这道题可以用数学知识来解决。首先我们要知道一个结论:设 $a,b$ 为正整数,$d=\gcd(a,b)$,则 $\operatorname{lcm}(a,b)=\frac{ab}{d}$。这个结论可以通过辗转相除法来证明。根据这个结论,我们可以得到 $\operatorname{lcm}(a_0,x)=\frac{a_0x}{a_1}$,所以 $x=\frac{a_1\operatorname{lcm}(a_0,x)}{a_0}$。同理,$x=\frac{b_0a_1}{\gcd(b_0,a_1)}$ 也是一个解。而且注意到这两个解是等价的,因为它们都可以化简为 $x=\frac{a_1b_0}{\gcd(a_1,b_0)}$。所以我们只需要求出 $\gcd(a_1,b_0)$,然后就可以得到答案了。
代码如下: