问题描述
小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 的倍数的个数。
应用容斥原理:将上述结果结合起来,得到最终答案。
总结
本题考查了容斥原理的应用,难度适中。