📜  LCM为N的最大非重复数之和(1)

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

LCM为N的最大非重复数之和

LCM(最小公倍数)为N的最大非重复数之和是一道经典算法题。问题描述如下:

给定一个正整数N,求出所有不大于N的正整数中LCM为N的最大非重复数之和。

例如,当N等于6时,所有不大于6的正整数中LCM为6的最大非重复数之和为11,因为1和5是不大于6的正整数中LCM为6的最大非重复数。

以下是Python的解决方案:

import math

def get_divisors(n):
    divisors = set()
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            divisors.add(i)
            divisors.add(n//i)
    return sorted(list(divisors))

def maximal_sum_of_nonrepeating_numbers_with_lcm(n):
    divisors = get_divisors(n)
    result_dict = {i: i for i in range(1, n+1)}
    for divisor in divisors:
        for i in range(divisor*2, n+1, divisor):
            if divisor in get_divisors(result_dict[i]):
                result_dict[i] = result_dict[i] // divisor
        result_dict[divisor] = n // divisor
    return sum(set(result_dict.values()))

print(maximal_sum_of_nonrepeating_numbers_with_lcm(6)) # output: 11
算法说明

该算法的关键是要找到N的所有因子,然后遍历这些因子,更新每个数字的LCM。

我们可以使用get_divisors()方法找到N的所有因子,然后遍历这些因子,从每个数字中除掉所有包含此因子的因子,保证该数字的LCM为N。

最后,返回所有不同数字的总和即为LCM为N的最大非重复数之和。

时间复杂度

最坏情况下时间复杂度为O(N log N)。

空间复杂度

空间复杂度取决于给定的N的因子数量,最多占用O(sqrt(N))的空间。

参考资料