洛谷P1029 最大公约数和最小公倍数问题 题解
题目链接:https://www.luogu.com.cn/problem/P1029
题目描述
输入 \(2\) 个正整数 \(x_0,y_0(2 \le x_0 \lt 100000,2 \le y_0 \le 1000000)\) ,求满足下列条件的 \(P,Q\) 的个数。
条件:
- \(P,Q\) 是正整数;
- 要求 \(P,Q\) 以 \(x_0\) 为最大公约数,以 \(y_0\) 为最小公倍数。
试求:满足条件的所有可能的 \(2\) 个正整数的个数。
输入格式
\(2\) 个正整数 \(x_0,y_0\)
输出格式
\(1\) 个数,表示求出满足条件的 \(P,Q\) 的个数
问题分析
这道题目虽然命名为《最大公约数和最小公倍数问题》并且它的确可以用最大公约数和最小公倍数的解法做,但是这道题目也可以用分解质因数的方法来解决。
下面分两种方法来解决这个问题:
解法1 GCD+枚举
这个GCD其实就是“最大公约数”(greatest common divisor)的简写。
首先,对于给我们的两个数 \(x_0\) 和 \(y_0\) ,如果 \(x_0\) 不能整除 \(y_0\) ,那么答案肯定是 \(0\) 个。
不然,我们就从 \(x_0\) 到 \(y_0\) 一路枚举 \(P\) ,根据 \(P\) 我们能够得到 \(Q\) 为 \(x_0 \times y_0 / P\) 。
当然此时的 \(Q\) 不一定是合法的,
\(Q\) 合法当且仅当 \(GCD(P,Q) = x_0\) 。
然后统计一下当 \(P\) 在区间 \([x0,y0]\) 范围内有多少个合法的 \(Q\) 即可。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
long long x, y;
long long gcd(long long a, long long b) {
if (b == 0) return a;
return gcd(b, a%b);
}
int main() {
cin >> x >> y;
if (y % x) puts("0");
else {
int cnt = 0;
for (long long p = x; p <= y; p ++) {
if (y % p || p % x) continue; // P必须满足能被x0整除,同时能整除y0
long long q = x * y / p;
if (gcd(p, q) == x) cnt ++;
}
cout << cnt << endl;
}
return 0;
}
然而这道题目还有更快的解法,这就是我接下来要介绍的:
解法2 分解质因数
我们以 “分解质因数” 的方法来解决这个问题。
首先,如果 \(x0\) 不能整除 \(y0\) ,那么答案肯定为 \(0\) ,直接输出 \(0\) 即可。
其次,我们令 \(n = y_0 / x_0\) ,然后对 \(n\) 进行质因数分解,假设对 \(n\) 进行质因数分解的表达式为:
\(n = a_1^{b_1} \times a_2^{b_2} \times \dots \times a_m^{b_m}\)
那么我们知道,对于其中的任意一个 \(a_i\) ,它要么归到 \(P\) ,要么归到 \(Q\) ,不可能有 \(1\) 个 \(a_i\) 归到 \(P\) ,而另一个 \(a_i\) 归到 \(Q\) (因为这个时候他们的最大公约数就变成了 \(x0 \times a_i\)) ,所以对于这 \(m\) 个 \(a_i\) ,他们要么都归到 \(P\) ,要么都归到 \(Q\) ,所以总的方案数就是 \(2^m\) 。
实现代码如下(代码中我用 \(cnt\) 来表示不同的质因数个数):
#include <bits/stdc++.h>
using namespace std;
int x, y, n, m;
int main() {
cin >> x >> y;
if (y % x) puts("0");
else {
n = y / x;
int a = sqrt(n); // 求平方根
for (int i = 2; i <= a; i ++) {
if (n % i == 0) {
m ++;
while (n % i == 0) n /= i;
}
}
if (n > 1) m ++;
cout << (1<<m) << endl;
}
return 0;
}
学过位运算的同学应该清楚,代码中的 \(1<<m\) 其实表示的就是 \(2^m\) ,而这就是我们的答案了。
洛谷P1029 最大公约数和最小公倍数问题 题解的更多相关文章
- [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)
[洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...
- 洛谷——P1029 最大公约数和最小公倍数问题
P1029 最大公约数和最小公倍数问题 题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1 ...
- 洛谷P1029 最大公约数和最小公倍数问题 [2017年6月计划 数论02]
P1029 最大公约数和最小公倍数问题 题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1 ...
- 洛谷 P1029 最大公约数和最小公倍数问题 Label:Water&&非学习区警告
题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...
- 洛谷P1029 最大公约数和最小公倍数问题
题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...
- 洛谷P1029 最大公约数和最小公倍数问题 (简单数学题)
一直懒的写博客,直到感觉不写不总结没有半点进步,最后快乐(逼着)自己来记录蒟蒻被学弟学妹打压这一年吧... 题目描述 输入22个正整数x_0,y_0(2 \le x_0<100000,2 \le ...
- 洛谷 P1029 最大公约数和最小公倍数问题
有两种做法 一种是gcd与lcm相乘后就是两个数的乘积,枚举第一个数,算出第二数,看最大公约数是不是题目给的. 第二种就lcm/gcd的答案为两个互质的数相乘.然后就枚举有多少组互质的数相乘等于lcm ...
- 洛谷P1029 最小公约数和最大公倍数问题【数论】
题目:https://www.luogu.org/problemnew/show/P1029 题意: 给定两个数$x$和$y$,问能找到多少对数$P$$Q$,使得他们的最小公约数是$x$最大公倍数是$ ...
- 【数论】P1029 最大公约数和最小公倍数问题
题目链接 P1029 最大公约数和最小公倍数问题 思路 如果有两个数a和b,他们的gcd(a,b)和lcm(a,b)的乘积就等于ab. 也就是: ab=gcd(a,b)*lcm(a,b) 那么,接下来 ...
随机推荐
- 现代IM系统中的消息系统架构 - 模型篇
前言 在架构篇中我们介绍了现代IM消息系统的架构,介绍了Timeline的抽象模型以及基于Timeline模型构建的一个支持『消息漫游』.『多端同步』和『消息检索』多种高级功能的消息系统的典型架构.架 ...
- @codechef - BUYLAND@ Buying Land
目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定一个 R * C 表示高度的矩阵 A,另一个 H * W 的矩阵 ...
- dev stg prd 开发 测试 生产环境
dev development 开发环境stg stage 测试环境prd product 线上环境
- oracle 用IN来替换OR
下面的查询可以被更有效率的语句替换: 低效: SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 3 ...
- Redis在Laravel项目中的应用实例详解
https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...
- spring mvc表单form值自动传到javabean-注解@ModelAttribute
直接通过Form Bean进行表单可以简化表单提交的处理,特别是对于复杂表单,过于简单的表单就不建议了,因为毕竟需要额外创建一个Form Bean.前段时间项目中有一个比较复杂的表单,有多层次而且涉及 ...
- Java反射机制(二):通过反射取得类的结构
在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor 表示类中的构造方法 · Field 表示类中的属性 · ...
- P1113 同颜色询问
题目描述 现在有一个包含 \(n\) 个元素的数组,它的元素的编号从 \(1\) 到 \(n\) . 每一个元素都有一个初始的颜色 \(C_i\) 以及数值 \(W_i\) . 这个数组支持 \(4\ ...
- java DOM 操作xml
1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...
- hibernate中因双向依赖而造成的json怪相--springmvc项目
简单说一下Jackson 如果想要详细了解一下Jackson,可以去其github上的项目主页查看其版本情况以及各项功能.除此以外,需要格外提一下Jackson的版本问题.Jackson目前主流版本有 ...