小C的数字倍数问题 | 豆包MarsCode AI刷题

65 阅读4分钟

问题描述

小U对数字倍数问题很感兴趣,她想知道在区间 [ 𝑙 , 𝑟 ] [l,r]内,有多少个数是 𝑎 a的倍数,或者是 𝑏 b的倍数,或者是 𝑐 c的倍数。你需要帮小U计算出这些数的个数。

测试样例

样例1:

输入:a = 2,b = 3,c = 4,l = 1,r = 10 输出:7

样例2:

输入:a = 5,b = 7,c = 11,l = 15,r = 100 输出:34

样例3:

输入:a = 1,b = 1,c = 1,l = 1,r = 1000 输出:1000

解题思路

计算单个数的倍数:首先,我们可以计算在区间 [l, r] 内,有多少个数是 a 的倍数,b 的倍数,以及 c 的倍数。

使用集合避免重复:为了避免重复计算,我们可以使用集合来存储这些倍数。

排除重复计算:由于一个数可能是多个数的倍数(例如,6 是 2 和 3 的倍数),我们需要排除这些重复计算

代码提示

def solution(a: int, b: int, c: int, l: int, r: int) -> int:
    # 创建一个集合来存储所有符合条件的数
    multiples = set()

    # 计算 a 的倍数
    for i in range(a, r + 1, a):
        if i >= l:
            multiples.add(i)

    # 计算 b 的倍数
    for i in range(b, r + 1, b):
        if i >= l:
            multiples.add(i)

    # 计算 c 的倍数
    for i in range(c, r + 1, c):
        if i >= l:
            multiples.add(i)

    # 返回集合的大小,即符合条件的数的个数
    return len(multiples)

if __name__ == "__main__":
    print(solution(2, 3, 4, 1, 10) == 7)
    print(solution(5, 7, 11, 15, 100) == 34)
    print(solution(1, 1, 1, 1, 1000) == 1000)

关键步骤解释

使用集合 multiples:集合可以自动处理重复元素,因此我们不需要手动去重。

循环计算倍数:通过 range(a, r + 1, a) 可以生成 a 的倍数,并检查是否在区间 [l, r] 内。

返回集合大小:集合的大小就是符合条件的数的个数。

可能遇到的问题: 如何使用容斥原理来解决这个问题?

使用容斥原理可以更高效地解决这个问题,避免重复计算。容斥原理的基本思想是:先计算所有单个条件的满足情况,然后减去所有两个条件的交集,再加上所有三个条件的交集。

解题思路

计算单个条件的满足情况:计算在区间 [l, r] 内,有多少个数是 a 的倍数,b 的倍数,以及 c 的倍数。

计算两个条件的交集:计算在区间 [l, r] 内,有多少个数同时是 a 和 b 的倍数,a 和 c 的倍数,以及 b 和 c 的倍数。

计算三个条件的交集:计算在区间 [l, r] 内,有多少个数同时是 a、b 和 c 的倍数。

应用容斥原理:将上述结果结合起来,得到最终答案。

代码实现

def solution(a: int, b: int, c: int, l: int, r: int) -> int:
    # 计算在区间 [l, r] 内,有多少个数是 x 的倍数
    def count_multiples(x):
        return (r // x) - ((l - 1) // x)

    # 计算单个条件的满足情况
    count_a = count_multiples(a)
    count_b = count_multiples(b)
    count_c = count_multiples(c)

    # 计算两个条件的交集
    count_ab = count_multiples(a * b)
    count_ac = count_multiples(a * c)
    count_bc = count_multiples(b * c)

    # 计算三个条件的交集
    count_abc = count_multiples(a * b * c)

    # 应用容斥原理
    result = count_a + count_b + count_c - count_ab - count_ac - count_bc + count_abc

    return result

if __name__ == "__main__":
    print(solution(2, 3, 4, 1, 10) == 7)
    print(solution(5, 7, 11, 15, 100) == 34)
    print(solution(1, 1, 1, 1, 1000) == 1000)

关键步骤解释

count_multiples 函数:计算在区间 [l, r] 内,有多少个数是 x 的倍数。公式为 (r // x) - ((l - 1) // x)。

计算单个条件的满足情况:分别计算 a、b、c 的倍数的个数。

计算两个条件的交集:分别计算 a 和 b、a 和 c、b 和 c 的倍数的个数。

计算三个条件的交集:计算 a、b 和 c 的倍数的个数。

应用容斥原理:将上述结果结合起来,得到最终答案。

总结

本题考查了容斥原理的应用,难度适中。