Hankson的趣味题
时间限制: 1 Sec 内存限制: 128 MB[ 提交][ 状态][ 讨论版]
题目描述
已知正整数a0,a1,b0,b1。设某未知正整数x 满足:
1. x 和a0 的最大公约数是a1;
2. x 和 b0 的最小公倍数是 b1。
求解满足条件的 x 的个数
1. x 和a0 的最大公约数是a1;
2. x 和 b0 的最小公倍数是 b1。
求解满足条件的 x 的个数
输入
第一行为一个正整数n,表示有n 组输入数据。接下来的n 行每行一组输入数据,为四
个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0 能被a1 整
个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0 能被a1 整
除,b1 能被b0 整除。
[说明]:
第一组输入数据,x 可以是9、18、36、72、144、288,共有6 个。
第二组输入数据,x 可以是 48、1776,共有 2 个。
[数据规模]:
对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。
对于 100%的数据,保证有 1≤a0,a1,b0,b1≤2,000,000,000 且 n≤2000。
输出
若不存在这样的 x,请输出0;
若存在这样的 x,请输出满足条件的 x 的个数;
若存在这样的 x,请输出满足条件的 x 的个数;
样例输入
2
41 1 96 288
95 1 37 1776
解题思路:首先由最大公因数和最小公倍数的性质可知,令 p=a0/a1,q=b1/b0,它们与X的公因数为1,并且x也是b1(最小公倍数)的一个因子,
所以 令x从1到sqrt(b1)中是b1(最小公倍数)的一个因子,除此外还有b1/x ,也可能是其中一个因子,用以上条件判断
1. int gcd(int a,int b) { //求最大公因数
return b==0?a:gcd(b,a%b);
}
2.判断gcd(x/a1,p)==1&&gcd(q,b1/x)==1;
代码如下:
#include<stdio.h>
int gcd(int a,int b) { //求最大公因数
return b==0?a:gcd(b,a%b);
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
int a0,a1,b0,b1;
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
int p=a0/a1,q=b1/b0,ans=0;
for(int x=1;x*x<=b1;x++)
if(b1%x==0){ //x是b1的一个因子
if(x%a1==0&&gcd(x/a1,p)==1&&gcd(q,b1/x)==1) ans++;
int y=b1/x; //y是另一个因子
if(x==y) continue;
if(y%a1==0&&gcd(y/a1,p)==1&&gcd(q,b1/y)==1) ans++;
}
printf("%d\n",ans);
}
return 0;
}