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

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

要点:两个数的乘积等于二者最大公约数和最小公倍数的乘积。

#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;
}
View Code

 

方法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。

#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\n",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\n",int(pow(2,k)));
    }
    return 0;
}
View Code

 

 

 

posted @ 2015-08-10 14:41  gongpixin  阅读(988)  评论(0编辑  收藏  举报