AcWing 890 能被整除的数
发布日期: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)

    代码解释

  • 输入处理:读取n和m,以及质数列表。
  • 初始化结果:初始结果为0。
  • 遍历所有子集:使用嵌套循环遍历所有可能的子集,使用bitmask表示子集选择。
  • 计算子集乘积:对于每个子集,计算其倍乘结果,并检查是否超过n。
  • 判断奇偶性:根据子集大小(质数数量)的奇偶性,决定是否加减该子集数目。
  • 输出结果:最终结果即为满足条件的整数个数。
  • 这种方法通过高效遍历所有子集并应用容斥原理,准确地计算了满足条件的数目。

    上一篇:AcWing 891 Nim游戏
    下一篇:AcWing 889 满足条件的01序列

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年03月15日 12时39分16秒

    关于作者

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

    推荐文章