最大公约数和最小公倍数问题

题目描述 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

首先我们要知道两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积

证明如下:

假设两个数为 a和b,他们的最大公约数是a/c,
那么他们的最小公倍数为 (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 }

 

 

posted @ 2016-07-09 15:07  Kiven#5197  阅读(1999)  评论(0编辑  收藏  举报