题解:洛谷 B4355 值日
【题目来源】
洛谷:B4355 [GESP202506 一级] 值日 - 洛谷
【题目描述】
小杨和小红是值日生,负责打扫教室。小杨每 \(m\) 天值日一次,小红每 \(n\) 天值日一次。今天他们两个一起值日,请问至少多少天后,他们会再次同一天值日?
【输入】
第一行,一个正整数 \(m\),表示小杨的值日周期;
第二行,一个正整数 \(n\),表示小红的值日周期。
【输出】
一行,一个整数,表示至少多少天后他们会再次同一天值日。
【输入样例】
4
6
【输出样例】
12
【核心思想】
-
问题分析:小杨每 \(m\) 天值日一次,小红每 \(n\) 天值日一次,今天两人同时值日,求下次同时值日的最少天数。这是一个最小公倍数(LCM)问题,核心在于理解"同时值日"意味着经过的天数既是 \(m\) 的倍数也是 \(n\) 的倍数。
-
算法选择:
- 欧几里得算法(GCD):通过辗转相除计算最大公约数
- LCM 公式:\(\text{lcm}(m, n) = \frac{m \times n}{\gcd(m, n)}\)
-
关键步骤:
- 读入数据:读取 \(m\) 和 \(n\)
- 计算 GCD:\(g = \gcd(m, n)\)
- 计算 LCM:\(ans = m \times n / g\)
- 输出结果:\(ans\)
-
时间/空间复杂度:
- 时间复杂度:\(O(\log(\min(m, n)))\),欧几里得算法的时间复杂度
- 空间复杂度:\(O(1)\)
-
数论基础的核心思想:
- 倍数与公倍数的概念:同时值日要求天数 \(d\) 满足 \(d \equiv 0 \pmod{m}\) 且 \(d \equiv 0 \pmod{n}\),即 \(d\) 是 \(m\) 和 \(n\) 的公倍数
- 最小性的保证:最小公倍数是所有公倍数中最小的正整数,因此 \(\text{lcm}(m, n)\) 即为答案
- GCD 与 LCM 的关系:利用 \(\gcd(m, n) \times \text{lcm}(m, n) = m \times n\) 的数学恒等式,通过 GCD 高效计算 LCM,避免枚举
- 欧几里得算法的高效性:辗转相除法在 \(O(\log(\min(m, n)))\) 时间内计算 GCD,远优于暴力枚举
- 适用于周期同步、事件同时发生的最小时间间隔计算类基础问题
【算法标签】
入门 #语法基础
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int m, n; // 定义两个整数变量
// 计算两个数的最大公约数(GCD)
int gcd(int a, int b)
{
// 使用欧几里得算法递归计算
if (a % b == 0)
return b; // 基准情况
else
return gcd(b, a % b); // 递归情况
}
int main()
{
// 输入两个正整数
cin >> m >> n;
// 计算并输出最小公倍数(LCM)
// LCM = (m × n) / GCD(m, n)
cout << m * n / gcd(m, n) << endl;
return 0;
}
【运行结果】
4
6
12
浙公网安备 33010602011771号