luoguP1029 最大公约数和最小公倍数问题 [gcd][数论]

题目描述

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数

条件:

1.P,Q是正整数

2.要求P,Q以x0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的两个正整数的个数.

输入输出格式

输入格式:

二个正整数x0,y0

输出格式:

一个数,表示求出满足条件的P,Q的个数

输入输出样例

输入样例#1:

3 60

输出样例#1:

4

说明

P,Q有4种

3 60 15 12 12 15 60 3



先考虑对P,Q进行质因数分解,得到

然后,

gcd同理,把max改成min就好了。

那么,对于把gcd为x,lcm为y的P,Q,若ri,ei不同,则有两种情况;

                 若ri与ei相等,则只有一种情况。

对P,Q分解质因数,统计质因数pi项二者的指数不同的项数ens,答案就是

ps:

1.可以做一些预先的判断,比如若x不整除于y,则答案必然为0。

2.可以令k=y/x,对k做质因数分解即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 using namespace std;
 6
 7 int x,y,k,ens=0;
 8
 9 int main(){
10     scanf("%d%d",&x,&y);
11     if(y%x){
12         puts("0");
13         return 0;
14     }
15     k=y/x;
16     for(int i=2;k!=1;i++){
17         if(k%i==0){
18             ens++;
19             while(k%i==0)  k/=i;
20         }
21     }
22     printf("%.0lf\n",pow(2,ens));
23     return 0;
24 }
时间: 2024-10-31 17:15:55

luoguP1029 最大公约数和最小公倍数问题 [gcd][数论]的相关文章

洛谷P1029 最大公约数和最小公倍数问题 [2017年6月计划 数论02]

P1029 最大公约数和最小公倍数问题 题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. 输入输出格式 输入格式: 二个正整数x0,y0 输出格式: 一个数,表示求出满足条件的P,Q的个数 输入输出样例 输入样例#1: 3 60 输出样例#1: 4 说明 P,Q有4种 3 60

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

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

最大公约数,最小公倍数,素数,素数筛

最大公约数 a.b的最大公约数是b,a%b的公约数,如果有一个等于0,最大公约数是a int gcd(int a,int n){ if (b==0) return a; else return gcd(b,a%b); } 或 return b!=0 ? gcd(b,a%b):a; 最小公倍数 是两数的乘积除以他们的最大公约数 素数筛 输出2-10000之间的所有素数 从2开始遍历,标记每个数的所有倍数为非素数 void sushu(){ for (int i=0;i<10000;i++){ ma

C编程:求最大公约数,最小公倍数。

#include<stdio.h> int main() { int a,b;//两个数 int x,y;//暂时保存a,b以便后面求最小公倍数p=(a*b)/a int p;//最小公倍数 int temp; while(scanf("%d %d",&a,&b)!=EOF)//ctrl+Z退出循环 { x=a; y=b;//暂时保存a,b的原值到x,y中,因为后面a,b的值要变. while(b!=0) { temp=a%b; a=b; b=temp; }

rwkj 1264 最大公约数与最小公倍数

总提交:1728            测试通过:649 描述 输入两个正整数m和n(1<m, n<1000000000),求其最大公约数和最小公倍数. 输入 有多行,每行2个正整数m和n. 输出 m和n的最大公约数.最小公倍数. 样例输入 16 245 7 样例输出 8 481 35 提示 要求:编写求最大公约数和最小公倍数的函数. #include <stdio.h>int gcd(int m,int n){ if(n==0) return m; else return gcd

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 样例

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

数学知识背景记录: 任何>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

小学奥数 最大公约数与最小公倍数

依然要用到均值不等式的知识,证明在这里:http://www.cnblogs.com/xtx1999/p/4913067.html 因为知道了两个数的最大公约数和最小公倍数,于是就知道了两个数的乘积.根据均值不等式,两个数和一定两数和一定,它们两个越接近乘积越大.所以乘积一定时,它们越接近和就越小所以枚举即可. #include<iostream> #include<cstdio> using namespace std; int gcd,lcm,a,b,tot,ans=10000