📅  最后修改于: 2023-12-03 14:43:51.941000             🧑  作者: Mango
LCM(Least Common Multiple),即最小公倍数,是指两个或多个整数公有的倍数中,最小的一个。
本文主要介绍如何求解LCM(1, n), LCM(2, n), LCM(3, n), ..., LCM(n, n)的总和。
首先我们需要明确LCM的求解方法,即先分解质因数,然后选取每个质数的最高次幂作为该质数的指数,最终将各个质数的指数相乘即可得到LCM。例如LCM(6, 10)的求解过程如下:
因此,对于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