已知正整数 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 的个数; 输入样例: 在这里给出一组输入。例如: 2 41 1 96 288 95 1 37 1776 输出样例: 在这里给出相应的输出。例如: 6 2用c语言写一下代码
时间: 2024-03-23 20:38:23 浏览: 110
以下是一个使用 C 语言求解的程序。这个程序使用了辗转相除法和欧几里得算法来计算最大公约数和最小公倍数:
```c
#include <stdio.h>
int gcd(int a, int b) {
int r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int solve(int a0, int a1, int b0, int b1) {
int d = gcd(a0, a1);
if (b1 % d != 0) {
return 0;
}
int l = lcm(a0 / d, b0);
int r = b1 / d;
return (r / l + (r % l == 0 ? 0 : 1));
}
int main() {
int n, a0, a1, b0, b1;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d%d%d", &a0, &a1, &b0, &b1);
printf("%d\n", solve(a0, a1, b0, b1));
}
return 0;
}
```
这个程序首先定义了两个函数 `gcd()` 和 `lcm()` 分别用于计算最大公约数和最小公倍数。然后,程序定义了一个 `solve()` 函数,用于计算满足条件的 x 的个数。该函数首先计算 a0 和 a1 的最大公约数 d,如果 b1 不能被 d 整除,则不存在满足条件的 x,返回 0。接着,程序计算 a0/d 和 b0 的最小公倍数 l,以及 b1/d 除以 l 的商 r。最后,程序返回 r/l,如果 r/l 余数不为 0,则再加 1。
在 `main()` 函数中,程序首先读入测试数据的数量 n。然后,程序循环 n 次,每次读入一组测试数据,调用 `solve()` 函数计算满足条件的 x 的个数,最后输出结果。
阅读全文