当前位置: 首页 > news >正文

P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题

  • 最大公约数(即 gcd)和最小公倍数(即 lcm)的求法。

该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 \(a \times b = \text{gcd}(a,b) \times \text{lcm}(a,b)\)。设作为答案的两个数为 \(x\)\(y\),我们要使它们同时满足以下三个条件,并统计这样的 \(x\)\(y\) 的个数(\(P,Q\) 含义见题目描述):

  • \(x \times y = P \times Q\)
  • \(\text{gcd}(x,y) = P\)
  • \(\text{lcm}(x,y) = Q\)

我们可以枚举 \(x\),判断是否存在满足条件 1 的整数 \(y\)(即,\(x\) 能被 \(P,Q\) 的积整除)。满足第一个条件后,再分别判断当前的 \(x,y\) 是否能够同时满足另外两个条件即可。显然,这种做法会超时。

考虑优化这个程序。我们其实并不需要枚举两次,因为对于不同的 \(x,y\),交换它们的值一定可以得到另一组与之对应的解。因此,从 \(1\)\(\sqrt{P \times Q}\) 枚举一遍,每发现一组答案就将 \(\text{ans}\) 的值加 \(2\) 即可。

一组 \(x,y\) 有对应解时有条件:\(x,y\) 的值不同。如果它们相同,交换后并不能得到与之对应的另一组数。
\(x = y\) 时,易得 \(x = y = \text{gcd}(x,y) = \text{lcm}(x,y)\) 所以要对此进行特判。\(P,Q\) 相等,这种情况就存在,\(\text{ans}\) 里要减去 \(1\)

一些代码实现技巧

  • c++里有一个自带的求 \(\text{gcd}\) 的函数叫 __gcd
  • 当积相同且 \(\text{gcd}\) 相同时,\(\text{lcm}\) 也一定相同,因此只需判断是否满足一、二两个条件即可。

AC代码:

#include<bits/stdc++.h>
using namespace std;
long long m,n,ans;
int main(){cin>>m>>n;if(m==n) ans--;n*=m;//把两数的积存入n中for(long long i=1;i*i<=n;i++){if(n%i==0&&__gcd(i,n/i)==m) ans+=2;}cout<<ans;return 0;
}

公式速记:
\(a \times b = \text{gcd}(a,b) \times \text{lcm}(a,b)\)

http://www.jsqmd.com/news/30333/

相关文章:

  • SQL Server 并发控制 第四篇:Snapshot Isolation (SI) 和 Read Committed Snapshot Isolation (RCSI)
  • godot 描边插件
  • 怎么在现有App里融入AI对话能力
  • DFS 序 O(1) 求 LCA
  • @pytest.fixture和setup/teardown
  • 矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”
  • Java异常处理实战精要:构建稳定应用的基石
  • €$P2025
  • CSP2025 补题
  • 哈希学习总结
  • 142.环形链表 II
  • 2025 年 11 月制冷设备厂家推荐排行榜,小型制冷设备,空调制冷设备,工业制冷设备,商用制冷设备,大型制冷设备,制冷设备安装与维修服务公司推荐
  • 从创作到分析全搞定!2025公众号效率工具深度测评,这波升级95%的人还不知道
  • 20232304 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • k8s-java应用部署(4)
  • 指数函数和对数函数
  • 2025-11-03 早报新闻
  • 单目三角化原理 - MKT
  • [CEOI 2017] Sure Bet
  • Java数组——三种初始化及内存分析,数组的基本特点,下标越界与小结
  • LeRobot v0.4.0 正式发布:全面提升开源机器人的学习能力
  • QPS、TPS、PV、UV、并发量
  • 补码加减法
  • 今天总结
  • whk 笔记
  • 冬月做题记录
  • 11月3号
  • 低代码与传统开发:不是替代,而是互补
  • 11.3模拟赛
  • 标题:低代码落地避坑指南:5 个最容易踩的雷区及解决方案