📜  LCM(1,n),LCM(2,n),LCM(3,n),…,LCM(n,n)的总和(1)

📅  最后修改于: 2023-12-03 14:43:51.941000             🧑  作者: Mango

LCM(1, n), LCM(2, n), LCM(3, n), ..., LCM(n, n)的总和

LCM(Least Common Multiple),即最小公倍数,是指两个或多个整数公有的倍数中,最小的一个。

本文主要介绍如何求解LCM(1, n), LCM(2, n), LCM(3, n), ..., LCM(n, n)的总和。

思路分析

首先我们需要明确LCM的求解方法,即先分解质因数,然后选取每个质数的最高次幂作为该质数的指数,最终将各个质数的指数相乘即可得到LCM。例如LCM(6, 10)的求解过程如下:

  • 6 = 2 * 3
  • 10 = 2 * 5
  • 取2的指数为1,取3的指数为1,取5的指数为1,LCM(6, 10) = 2^1 * 3^1 * 5^1 = 30。

因此,对于LCM(1, n),其质因数分解的结果为n的所有质因数的乘积,即n = p1^a1 * p2^a2 * ... * pk^ak,则 LCM(1, n) = p1^a1 * p2^a2 * ... * pk^ak。同理,LCM(2, n) 的质因数分解结果可以在 LCM(1, n) 的结果的基础上,增加n的各个质因数的最高次幂,即 LCM(2, n) = p1^b1 * p2^b2 * ... * pk^bk,其中,b1 = a1 或 a1 + 1,b2 = a2 或 a2 + 1,以此类推。

综上所述,LCM(1, n), LCM(2, n), LCM(3, n), ..., LCM(n, n) 的总和可以通过质因数分解后求解每个数的指数,再将指数相加,最终将相加后的指数相应的质数乘起来即可。

代码实现

下面给出具体的代码实现,假设已有一个函数prime_factors(n)用于计算n的质因数分解结果,返回一个字典,其中key为分解得到的质因数,value为对应质因数的指数。

def prime_factors(n):
    factors = {}

    while n % 2 == 0:
        if 2 not in factors:
            factors[2] = 0
        factors[2] += 1
        n //= 2

    for i in range(3, int(n ** 0.5) + 1, 2):
        while n % i == 0:
            if i not in factors:
                factors[i] = 0
            factors[i] += 1
            n //= i

    if n > 2:
        if n not in factors:
            factors[n] = 0
        factors[n] += 1

    return factors


def sum_lcm(n):
    lcm_sum = 1
    factors = {}

    for i in range(2, n + 1):
        tmp_factors = prime_factors(i)
        for k, v in tmp_factors.items():
            if k not in factors or v > factors[k]:
                factors[k] = v

    for k, v in factors.items():
        lcm_sum *= k ** v

    return lcm_sum
测试样例

我们可以通过以下测试样例检验上述代码的正确性。

assert sum_lcm(1) == 1
assert sum_lcm(2) == 2
assert sum_lcm(3) == 9
assert sum_lcm(4) == 48
assert sum_lcm(5) == 300