题目描述 Description
输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数
条件: 1.P,Q是正整数
2.要求P,Q以x0为最大公约数,以y0为最小公倍数.
试求:满足条件的所有可能的两个正整数的个数.
输入描述 Input Description
二个正整数x0,y0
输出描述 Output Description
满足条件的所有可能的两个正整数的个数
样例输入 Sample Input
3 60
样例输出 Sample Output
4
方法1:枚举
要点:两个数的乘积等于二者最大公约数和最小公倍数的乘积。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int main(){ int x,y,v,k,m=0,i; scanf("%d%d",&x,&y); v=x*y; k=sqrt(v); for(i=x;i<=k;++i) if(v%i==0&&gcd(v/i,i)==x)++m; printf("%d",m*2); return 0; }
方法2:分解质因数(最优)
要点:两个数的乘积等于二者最大公约数和最小公倍数的乘积。
思路:题目要求最大公约数(gcd)为3,最小公倍数(lcm)为60的两个数p、q的组数,两个数都去掉gcd后,即样例中的3、60变为1、20。这样即可变为求gcd为1,lcm为20的两个数p、q的组数,即找两个互质的数,他们的乘积为20。那么可以对20进行质因数分解,得:2、2、5。盯住其中一个数,从质因数中选择。由于两个数要求互质,所以相同的质因数要合并,得到:4、5。选法有2^2=4种:1,4,5,20。对应的四组答案即:1-20,4-5,5-4,20-1。乘以gcd得到原来题目答案:3-60,12-15,15-12,60-3。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int main(){ int x,y,z,k=0,i;//k为不同质因数的个数 scanf("%d%d",&x,&y); if(y%x!=0)printf("%d ",0); else{ z=y/x;//除以最大公约数x //质因数分解 for(i=2;i<=z;++i){ if(z%i==0){ ++k; while(z%i==0)z=z/i;//合并相同的质因数 } } printf("%d ",int(pow(2,k))); } return 0; }