📜  小于或等于N的A,B或C的倍数计数(1)

📅  最后修改于: 2023-12-03 15:25:22.861000             🧑  作者: Mango

小于或等于N的A,B或C的倍数计数

本程序用于计算小于或等于N的A,B或C的倍数的个数。

使用方法

输入3个非负整数N,A,B,C,其中A,B,C至少有一个不为0,程序将输出小于或等于N的A,B或C的倍数的个数。

算法分析

本程序使用容斥原理,通过计算单个数的倍数、两个数的公倍数、三个数的公倍数,找出小于或等于N的A,B或C的倍数的个数。具体方法如下:

  • 单个数的倍数计数:假设A为例,A的倍数为1A,2A,3A,...,小于或等于N的A的倍数的个数为floor(N/A)。
  • 两个数的公倍数计数:假设A,B为例,A,B的公倍数为LCM(A,B)的倍数,LCM(A,B)为A,B的最小公倍数。通过求解gcd(A,B)和LCM(A,B),使用公式floor(N/A)+floor(N/B)-floor(N/LCM(A,B))计算小于或等于N的A,B的公倍数的个数。
  • 三个数的公倍数计数:假设A,B,C为例,三个数的公倍数为LCM(A,B,C)的倍数,LCM(A,B,C)为A,B,C的最小公倍数,通过求解gcd(A,B,C)和LCM(A,B,C),使用容斥原理计算小于或等于N的A,B,C的倍数的个数。
示例

输入:

N = 20
A = 3
B = 5
C = 7

输出:

7
代码实现
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

def lcm(a, b):
    return a // gcd(a, b) * b

def count_multiples(n, a):
    return n // a

def count_common_multiples(n, a, b):
    return count_multiples(n, a) + count_multiples(n, b) - count_multiples(n, lcm(a, b))

def count_total_multiples(n, a, b, c):
    ab_lcm = lcm(a, b)
    ac_lcm = lcm(a, c)
    bc_lcm = lcm(b, c)
    abc_lcm = lcm(ab_lcm, c)
    return count_multiples(n, a) + count_multiples(n, b) + count_multiples(n, c) \
           - count_common_multiples(n, a, b) - count_common_multiples(n, a, c) - count_common_multiples(n, b, c) \
           + count_multiples(n, abc_lcm)

以上是 Python 实现方式,其他语言也可以实现类似的算法。