top1编程
← 返回题目
题解

【入门】兴趣班的排班

1 条题解

  • 0
    @ 2026-7-31 15:11:18

    解题思路

    n 名同学上课频率不同(每隔 k 天上一次课),第一天都上课,问最少第几天所有人一起上课。

    核心:最小公倍数。

    每个同学上课的时间是第 1 天、第 1+k 天、第 1+2k 天……

    所有人一起上课,说明这个天数是所有频率的倍数。第一次一起上课(除了第 1 天),就是所有频率的最小公倍数 lcm 天之后。

    所以答案 = lcm(所有频率) + 1。

    怎么求最小公倍数?

    利用公式:lcm(a,b) = a × b ÷ gcd(a,b)。

    逐个合并:

    • lcm 初始为 1
    • 每次读入一个频率 k,更新 lcm = lcm ÷ gcd(lcm,k) × k

    gcd 是什么? 最大公约数,用辗转相除法求。

    举例:频率 3、2、4

    • LCM(3,2,4) = 12
    • 答案 = 12 + 1 = 13

    参考代码

    #include <iostream>
    using namespace std;
    
    long long gcd(long long a, long long b) {
        while (b) {
            long long t = a % b;
            a = b;
            b = t;
        }
        return a;
    }
    
    int main() {
        int n, k;
        cin >> n;
    
        long long lcm = 1;
        for (int i = 0; i < n; i++) {
            cin >> k;
            lcm = lcm / gcd(lcm, k) * k;  // 合并最小公倍数
        }
    
        cout << lcm + 1;  // 除第一天外
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N log M),每次求 gcd
    • 空间复杂度:O(1)
    • 1