zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
    View Code
  • 相关阅读:
    dpdk优化相关 转
    常用的TCP Option
    c10k C10M
    Linux惊群效应详解
    bloomfilter 以及count min sketch
    Squid 搭建正向代理服务器
    Openflow的架构+源码剖析 转载
    Hyperscan与Snort的集成方案
    动态图
    psutil 模块
  • 原文地址:https://www.cnblogs.com/gongpixin/p/4717983.html
Copyright © 2011-2022 走看看