题解:洛谷 B4355 值日

【题目来源】

洛谷:B4355 [GESP202506 一级] 值日 - 洛谷

【题目描述】

小杨和小红是值日生,负责打扫教室。小杨每 \(m\) 天值日一次,小红每 \(n\) 天值日一次。今天他们两个一起值日,请问至少多少天后,他们会再次同一天值日?

【输入】

第一行,一个正整数 \(m\),表示小杨的值日周期;

第二行,一个正整数 \(n\),表示小红的值日周期。

【输出】

一行,一个整数,表示至少多少天后他们会再次同一天值日。

【输入样例】

4
6

【输出样例】

12

【核心思想】

  1. 问题分析:小杨每 \(m\) 天值日一次,小红每 \(n\) 天值日一次,今天两人同时值日,求下次同时值日的最少天数。这是一个最小公倍数(LCM)问题,核心在于理解"同时值日"意味着经过的天数既是 \(m\) 的倍数也是 \(n\) 的倍数。

  2. 算法选择

    • 欧几里得算法(GCD):通过辗转相除计算最大公约数
    • LCM 公式\(\text{lcm}(m, n) = \frac{m \times n}{\gcd(m, n)}\)
  3. 关键步骤

    • 读入数据:读取 \(m\)\(n\)
    • 计算 GCD\(g = \gcd(m, n)\)
    • 计算 LCM\(ans = m \times n / g\)
    • 输出结果\(ans\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\log(\min(m, n)))\),欧几里得算法的时间复杂度
    • 空间复杂度:\(O(1)\)
  5. 数论基础的核心思想

    • 倍数与公倍数的概念:同时值日要求天数 \(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
posted @ 2026-07-16 16:09  团爸讲算法  阅读(8)  评论(0)    收藏  举报