满足条件的数字有多少?
已知正整数 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
多说一句
这里经常会运行超时,需要以下扩展知识:
采用此方法,相信可以理解下列代码:
代码示例(仅供参考):
#include<stdio.h>
#include<math.h>
int gmd(int x,int y)
{
int m, n, a, b;
m=x;
n=y;
while(y!=0)
{
a=x%y;
x=y;
y=a;
}
return x;
}
int main()
{
int i,j,k;
int a0,a1,b0,b1,x,flag1=0,r1,r2;
int n;
scanf("%d",&n);
for(k=1;k<=n;k++)
{
flag1=0;
scanf("%d %d %d %d",&a0,&a1,&b0,&b1);
r1=a0/a1;r2= b1/b0;
for(i=1;i*i<=b1;i++)
{
if(gmd(i/a1,r1)==1&&gmd(r2,b1/i)==1)
flag1=flag1+1;
}
printf("%d\n",flag1);
}
return 0;
}