题目描述
输入两个正整数 x,y,求出满足下列条件的 P,Q 的个数:
-
P,Q 是正整数。
-
要求 P,Q 以 x 为最大公约数,以 y 为最小公倍数。
试求:满足条件的所有可能的 P,Q 的个数。
输入格式
一行两个正整数 x,y。
输出格式
一行一个数,表示求出满足条件的 P,Q 的个数。
输入输出样例
输入
3 60
输出
4
思路
- 两个数的乘积就等于它们最大公约数与最小公倍数的乘积,所以 P * Q = x * y = 定值。
- 并且 P 和 Q 都为最大公约数 x 的倍数,假设 P 从 x 的倍数开始增加,通过P * Q = x * y = 定值 求出 Q 的值
- 求出此时的 P 和 Q 的最小公倍数,如果它们最小公倍数等于 x,就说明符合条件,就可以记录下来
- 值得注意的是,P , Q 是正整数,所以当定值(x * y)% P!=0时就说明 Q 不是整数,这种情况需要直接跳过
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int temp1=a; //P 从最小公倍数开始
int temp2; //定义 Q
int count=1; //倍数的叠加
int res=0; //记录满足条件的个数
while (temp1<=b){ //P 应该小于最大公约数
temp1=a*count; //让 P 开始以倍数形式递增
if ((a*b)%temp1!=0){ //说明此时的 P得出的 Q 不是整数
count++; //跳过这次判断
continue;
}
temp2=a*b/temp1; //得出 Q
int f = f(temp1, temp2); //得出他们的最小公倍数
if (f==a){
res++;
}
count++;
}
System.out.println(res);
}
public static int f(int a,int b){ //利用更相减损法求最大公约数
while (a!=b){
if (a>b){
a=a-b;
}else {
b=b-a;
}
}
return a;
}
}