题目描述
输入两个正整数 x0,y0x_0, y_0x0,y0,求出满足下列条件的 P,QP, QP,Q 的个数:
P,Q是正整数。
要求 P,Q以 x0 为最大公约数,以 y0 为最小公倍数。
试求:满足条件的所有可能的 P,Q的个数。
输入格式
一行两个正整数 x0,y0。
输出格式
一行一个数,表示求出满足条件的 P,Q 的个数。
输入输出样例 输入 #1
3 60
输出 #1
4
说明/提示
P,Q 有 444 种:
3,60
15,12
12,15
60,3
思路:
(百科的图)
最大公约数和最小公倍数的关系:
a * b = ab两个数的最大公约数和最小公倍数之积
因此: 最小公倍数=a*b / 最大公约数
代码:
#include <iostream>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main()
{
int x,y,p,q,ans=0;
cin>>x>>y;
for(p=x;p<=y;p++) //一层循环就够了,根据他们的关系直接求出另一个数
{
if(x*y%p) continue; //不是整除直接跳过
q=x*y/p;
// int yue=q<p?gcd(q,p):gcd(p,q);似乎两个数的顺序没要求今天才知道
int yue=gcd(q,p); //这样也能过
if( yue==x && (q*p)/yue==y) //公约数=x,公倍数=y
ans++; //是一种方案
}
cout<<ans;
return 0;
}