最大公约数和最小公倍数问题
题目描述 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 Input3 60
样例输出 Sample Output4
首先我们要知道两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积
证明如下:
假设两个数为 a和b,他们的最大公约数是a/c,
那么他们的最小公倍数为 (a/c) * a/(a/c) * b/(a/c)
化简后得 b*c
所以 最大公约数 乘以 最小公倍数 = (a/c) * (b*c) =a*b
那么他们的最小公倍数为 (a/c) * a/(a/c) * b/(a/c)
化简后得 b*c
所以 最大公约数 乘以 最小公倍数 = (a/c) * (b*c) =a*b
所以两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积
附AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int main(){ 8 int x,y,num,ans=0,a,n,m,r; 9 cin>>x>>y; 10 num=x*y;//num即为两数乘积 11 for(int i=x;i*i<num;i+=x){//可以证明当i*i<num,出现的满足条件数字组合是i*i<m中满足条件的数字组合的相反组合, 12 //i*i=num肯定的是不满足的。i一定要是最大公因数的x倍,所以直接+=x 13 if(num%i==0){//保证num/i是一个整数 14 a=num/i;//另一个数 15 if(a%x==0){//保证a可以除尽最大公因数 16 n=i/x; 17 a=a/x; 18 r=n%a; 19 while(r!=0){ 20 r=n%a; 21 n=a; 22 a=r; 23 }//判断同时除以n后两数是否还有其他公因数 24 if(n==1||i/x==1)//互质 25 ans+=2;//因为是正反两种所以直接加二 26 } 27 28 } 29 } 30 cout<<ans<<endl; 31 return 0; 32 }