
AcWing 890 能被整除的数
输入处理:读取n和m,以及质数列表。 初始化结果:初始结果为0。 遍历所有子集:使用嵌套循环遍历所有可能的子集,使用bitmask表示子集选择。 计算子集乘积:对于每个子集,计算其倍乘结果,并检查是否超过n。 判断奇偶性:根据子集大小(质数数量)的奇偶性,决定是否加减该子集数目。 输出结果:最终结果即为满足条件的整数个数。
发布日期:2021-05-28 16:27:13
浏览次数:31
分类:精选文章
本文共 1033 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要计算在1到n之间的整数中,能被给定的m个不同的质数中的至少一个整除的数的个数。这个问题可以通过容斥原理来解决,这涉及到多个集合的并集计算。
方法思路
问题分析:我们需要找到1到n之间能被给定质数中至少一个整除的数。由于包含重复计算,我们需要使用容斥原理来避免重复计数。
容斥原理:容斥原理用于计算多个集合的并集,避免重复计数。具体来说,对于每个质数集合,计算其倍数总数,然后减去所有两两交集数目,加上所有三三交集数目,依此类推。
子集表示:使用二进制掩码表示每个质数的子集,这样可以简化处理每个可能集合的逻辑。
算法步骤:
- 遍历所有可能的子集,使用二进制掩码表示。
- 对于每个子集,计算其倍数积,并确定该子集被包含的质数数量。
- 根据子集大小的奇偶性,决定是否加上或减去该子集数目。
解决代码
n, m = map(int, input().split())primes = list(map(int, input().split()))res = 0for mask in range(1, 1 << m): product = 1 count = 0 for i in range(m): if (mask >> i) & 1: if product > n // primes[i]: product = -1 # 避免乘法溢出 break product *= primes[i] count += 1 if product == -1: continue if count % 2 == 1: res += n // product else: res -= n // productprint(res)
代码解释
这种方法通过高效遍历所有子集并应用容斥原理,准确地计算了满足条件的数目。
发表评论
最新留言
很好
[***.229.124.182]2025年03月15日 12时39分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!