codevs 1012 最大公约数以及最小公倍数问题 x

题目描述 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×B除以二者的最小公倍数,就能得到了二者的最大公约数

当然前提是这两个数要是非零的两个整数

最大公约数=A×B/最小公倍数

反过来,最小公倍数=A×B/最大公约数

那么这道题就很简单地做出来了:

方法一:枚举

 1 #include<iostream>
 2 #include<cmath>
 3
 4 using namespace std;
 5
 6 int gcd(int a,int b)//求最大公约数
 7 {
 8     while(b!=0)//辗转相除法求最大公约数
 9     {
10       int qwq=a%b;
11       a=b;
12       b=qwq;
13     }
14     return a;
15     //return b == 0 ? a : gcd(b,a%b);
16 }
17
18 int main()
19 {
20     int x,y;
21     cin>>x>>y;//输入最大公约数以及最小公倍数
22     int v=x*y;//最大值
23     int s=(int)sqrt(v);//不用重复进行寻找
24     int n=0;
25     for(int i=x;i<=s;i++)
26     if((v%i==0)//如果最大值能够整除当前的数,则说明找到了一组可能是真的的解
27     &&(gcd(v/i,i)==x))//如果另外一个数与当前的数的最大公约数等于输入的最大公约数
28     n++;//进行计数
29     cout<<n*2;// 不进行重复的筛之后要加上另一块的
30     return 0;
31 }  

方法二:分解质因数(最优)

思路:题目要求最大公约数(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。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4
 5 using namespace std;
 6
 7 int main(){
 8     int x,y,z,k=0,i;//k为不同质因数的个数
 9     scanf("%d%d",&x,&y);
10     if(y%x!=0) printf("%d\n",0);
11     else{
12         z=y/x;//除以最大公约数x
13         for(i=2;i<=z;++i){//质因数分解
14             if(z%i==0){
15                 ++k;
16                 while(z%i==0)z=z/i;//合并相同的质因数
17             }
18         }
19         printf("%d\n",int(pow(2,k)));
20     }
21     return 0;
22 }
时间: 2024-10-19 14:58:29

codevs 1012 最大公约数以及最小公倍数问题 x的相关文章

【数论】【最大公约数】【枚举约数】CODEVS 1012 最大公约数和最小公倍数问题 2001年NOIP全国联赛普及组

对于一对数(p,q),若它们的gcd为x0,lcm为y0, 则:p*q/x0=y0,即q=x0*y0/p, 由于p.q是正整数,所以p.q都必须是x0*y0的约数. 所以O(sqrt(x0*y0))地枚举约数,依次用gcd判断. 1 #include<cstdio> 2 #include<cmath> 3 using namespace std; 4 typedef long long LL; 5 LL limit,Q,P,To; 6 int ans; 7 LL gcd(LL a,

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

http://codevs.cn/problem/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 满足条件的所有可能的两个正

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 满足条件的所有可

最大公约数和最小公倍数

输入两个正整数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