洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
1.洛谷P5707 【深基2.例12】上学迟到2.洛谷P5710 【深基3.例2】数的性质3.洛谷P1914 小书童——凯撒密码4.洛谷P1047 [NOIP2005 普及组]校门外的树5.洛谷P5728 【深基5.例5】旗鼓相当的对手6.洛谷P5721 【深基4.例6】数字直角三角形7.洛谷[NOIP2015 普及组] 金币8.洛谷[NOIP2011 普及组]数字反转9.洛谷P4956 [COCI2017-2018#6] Davor10.洛谷B3843 [GESP202306 三级]密码合规11.洛谷P1601 A+B Problem(高精度加法)12.洛谷P1614 爱与愁的心痛(滑动窗口解法)13.洛谷P2670 [NOIP2015 普及组] 扫雷游戏14.洛谷P1563 [NOIP2016 提高组] 玩具谜题15.洛谷B3849 [GESP样题 三级] 进制转换16.洛谷P1100 高低位交换17.洛谷P1143 进制转换18.[NOIP2008 提高组] 笨小猴(洛谷题号P1125)19.洛谷[NOIP2015 普及组] 金币20.洛谷P3383 【模板】线性筛素数
21.洛谷P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
22.洛谷B3940 [GESP样题 四级] 填幻方23.洛谷P1042 [NOIP2003 普及组] 乒乓球24.洛谷P1067 [NOIP2009 普及组] 多项式输出25.洛谷P1098 [NOIP2007 提高组] 字符串的展开26.洛谷P1842 [USACO05NOV] 奶牛玩杂技27.洛谷P1223 排队接水28.洛谷P1209修理牛棚 Barn Repair29.洛谷P5250 【深基17.例5】木材仓库30.洛谷P1226 【模板】快速幂31.洛谷P1480 A/B Problem32.洛谷P1786 帮贡排序33.双指针习题:Kalindrome Array[NOIP2001 普及组] 最大公约数和最小公倍数问题
题目描述
洛谷题目链接:https://www.luogu.com.cn/problem/P1029
输入两个正整数 x, y,求出满足下列条件的 P, Q的个数:
-
P,Q 是正整数。
-
要求 P, Q 以x 为最大公约数,以 y 为最小公倍数。
试求:满足条件的所有可能的 P, Q 的个数。
输入格式
一行两个正整数 x, y。
输出格式
一行一个数,表示求出满足条件的 P, Q 的个数。
样例 #1
样例输入 #1
3 60
样例输出 #1
4
提示
P,Q 有 4 种:
- 3, 60。
- 15, 12。
- 12, 15。
- 60, 3。
对于 100% 的数据,2<=x,y<=10^5.
【题目来源】
NOIP 2001 普及组第二题
思路:
我们可以枚举最大公倍数y的所有因子,然后检查每一对因子的最小公倍数是不是x即可。最后算出所有的对数。
这段代码是用来解决题目中要求的问题:找出满足条件的 ( P, Q ) 的个数,使得它们的最大公约数是 ( x ),最小公倍数是 ( y )。
AC代码如下:
#include<iostream> using namespace std; int gcd(int x, int y) { return y ? gcd(y, x % y) : x; } int main() { int x, y; int count = 0; cin >> x >> y; for (int k = 1; k <= y / k; k++) { if (y % k == 0) { if (gcd(k, y / k * x) == x) count++; if (k != y / k) { if (gcd(y / k , k * x) == x) count++; } } } cout << count; return 0; }
代码解析如下:
-
函数
gcd(int x, int y)
:- 这是一个递归函数,用来计算两个整数 ( x ) 和 ( y ) 的最大公约数(GCD)。
- 如果 ( y ) 不为0,则递归地调用自身,传入 ( y ) 和 ( x \mod y )。
- 当 ( y ) 为0时,返回 ( x ),即此时的 ( x ) 就是最大公约数。
-
主函数
main()
:- 首先声明了几个变量:
x, y, p, q, count
,其中count
用来统计满足条件的 ( P, Q ) 的个数。 - 输入读取了两个正整数 ( x ) 和 ( y )。
- 首先声明了几个变量:
-
循环部分:
for (int k = 1; k <= y / k; k++)
:从 ( k = 1 ) 开始,遍历到 ( k ) 小于等于 ( sqrt(y) )。if (y % k == 0)
:检查 ( k ) 是否是 ( y ) 的因子。- 如果是 ( y ) 的因子,说明 ( y ) 可以分解为 (y=k*(y/k))。
if (gcd(k, y / k * x) == x) count++
和if (gcd(y / k, k * x) == x) count++
:- 分别检查 (k,y/k*x)与(y/k,k/x) 这两对是否满足条件。
- 即检查它们的最大公约数是否等于 ( x )。
-
输出部分:
- 输出
count
,即满足条件的 ( P, Q ) 的个数。
- 输出
这段代码利用了数学上的性质,通过分解 ( y ) 的因子来检查每一对 ( P, Q ) 是否满足条件,使用了最大公约数函数 gcd
来验证条件。这种方法相比直接遍历所有可能的 ( P, Q ) 组合更加高效。
示例解析
对于输入 3 60
,程序会计算:
- ( x = 3 ),( y= 60 )。
- 遍历 ( k ) 从 1 到 ( sqrt(60)):
- 找到 ( k = 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 ) 是 ( 60 ) 的因子。
- 对每个 ( k ),检查 ( (k, 60/k 3) ) 和 ( (60/k, k* 3) ) 是否满足条件。
- 统计满足条件的 ( P, Q ) 的个数。
输出结果为 4
,符合示例中的期望结果。
合集:
洛谷
分类:
洛谷 / 基础数学问题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战