
AcWing 890 能被整除的数
输入处理:读取n和m,以及质数列表。 初始化结果:初始结果为0。 遍历所有子集:使用嵌套循环遍历所有可能的子集,使用bitmask表示子集选择。 计算子集乘积:对于每个子集,计算其倍乘结果,并检查是否超过n。 判断奇偶性:根据子集大小(质数数量)的奇偶性,决定是否加减该子集数目。 输出结果:最终结果即为满足条件的整数个数。
发布日期:2021-05-28 16:27:13
浏览次数:32
分类:精选文章
本文共 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)
代码解释
这种方法通过高效遍历所有子集并应用容斥原理,准确地计算了满足条件的数目。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月14日 15时28分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
wxPython的使用
2021-05-03
红黑树(1):B-树
2021-05-03
安装APEX
2021-05-03
站长常用Shell脚本整理分享(全)
2021-05-03
linux 内核提权总结(demo+exp分析) -- 任意读写(二)
2021-05-03
2020年电工(初级)考试题及电工(初级)考试题库
2021-05-03
2020年电气试验考试技巧及电气试验模拟试题
2021-05-03
2021年电工(中级)考试报名及电工(中级)模拟试题
2021-05-03
直接插入排序
2021-05-03
Java发送邮件必带超时时间配置
2021-05-03
redis安裝并与SpringBoot整合
2021-05-03
一文搞懂Python中的所有数组数据类型
2021-05-03
温故而知新,重温 Java 7 的那些“新”特性
2021-05-03
drawRoundRect 边线跟角线粗细不一样
2021-05-03
DOM Insertion, Inside 追加元素内容
2021-05-03
轻量级阻塞和重量级阻塞
2021-05-03
访问http://ip:port/nexus,出现404
2021-05-03
springboot配置freemarker模板
2021-05-03
Canvas绘制动画
2021-05-03