【codevs1012】最大公约数和最小公倍数

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

分析:

p和q的最大公约数(gcd)是x,最小公倍数(lcm)是y

那么p*q=x*y

设p=x*i,q=x*j,i和j互质

则p*q=(x*i)*(x*j)=x*y,那就有i*j=y/x

我们可以枚举i,从i=1开始,直到i*i>y/x

如果i是y/x的因子

然后j=(y/x)/i

再判断i和j是否互质

因为每次得到的两个数中比较小的就是i,比较大的数是j,i是小于根号(y/x)的,j就是大于根号(y/x)因此不会重复计算,那算到一次,答案就累加2。

代码:

#include<iostream>
using namespace std;

int gcd(int x,int y)
{
    return(x%y==0?y:gcd(y,x%y));
}
int main()
{
    int x,y,ans=0;
    cin>>x>>y;
    if(y%x){
        cout<<0;
        return 0;
    }
    y=y/x;
    for(int i=1; i*i<=y; i++)
    {
        if(y%i==0&&gcd(i,y/i)==1)
            ans+=2;
    }
    cout<<ans<<endl;
}

  

时间: 2024-10-13 15:27:24

【codevs1012】最大公约数和最小公倍数的相关文章

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

1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组 题目描述 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 满足条件的所有可

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

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

最大公约数和最小公倍数

输入两个正整数m和n求最大公约数和最小公倍数. #include <stdio.h> int main() { int m, n; printf("请输入你要计算的两个数:"); scanf("%d %d", &m, &n); printf("最大公约数是:"); printf("%d\n", get_max_common_measure(m, n)); printf("最小公倍数是:&q

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

计算两个整数的最大公约数和最小公倍数

算法一 任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现. 则整数x,y可以分别标记为:x=p1x1p2x2...pmxm y=p1y1p2y2...pmym (其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0) (1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym) (2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym

输入两个正整数m和n,求其最大公约数和最小公倍数。

package a; import java.util.*; public class Yueshubeishu { public static void main(String[] args) { System.out.println("输入两个正整数:"); Scanner a=new Scanner(System.in); int m=a.nextInt(); Scanner b=new Scanner(System.in); int n=b.nextInt(); int c=m

求最大公约数和最小公倍数

学习C++入门级的题目,求最大公约数和最小公倍数,这里介绍两种求最大公约数的方法,即辗转相除法和辗转相减法.辗转相除法的原理自行百度,辗转相减法的原理就是只要两数不想等就用大数减小数,直至相等,求最小公倍数的方法就是用两数的乘积除以最大公约数. #include<iostream> using namespace std; int maxf(int a,int b)//辗转相减法 { while(a != b) { if(a > b) return a = a - b; else ret

求两个数的最大公约数和最小公倍数 C语言

C程序设计第八章的第一道题目,求两个数的最大公约数和最小公倍数.需要注意一下几点: 1.最大公约数和最小公倍数间的关系: 设两个数是a,b最大公约数是p,最小公倍数是q 那么有这样的关系:ab=pq 所以q=ab/p.2.任意整数和0的公约数是该整数的所有约数,所以它们的最大公约数为该整数本身.3.碾转相除法:被除数%除数=余数,如果余数不为0,就让原来的除数做为被除数,余数作为除数,再进行运算 被除数%除数=余数,直到得到的余数为0为止,此时的除数就是最大公约数. #include <stdi

求最大公约数与最小公倍数and输出锥形图案

1:描述:用Python求两个数的最大公约数与最小公倍数.(注意输入的俩个数在正整数范围内) code(代码): a=eval(input('请输入第一个整数:')) b=eval(input('请输入第二个整数:')) c=1 d=a*b if(a<=0 or b<=0): print('输入有误') else: if(a<b): c=a a=b b=c while(c!=0): c=a-b if(c==0): break else: if(c>b): a=c else: a=b

代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5

import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void main(String[] args) { int n = inNumber(); int m = inNumber(); int yue = 1; int bei = m*n; for (int i = 2; i < n*m; i++) { if (m % i == 0 && n %