📜  小于N且主除数之和为K的数字的计数(1)

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

小于N且主除数之和为K的数字的计数

本题需要计算小于N且主除数之和为K的数字的个数。主除数指能整除该数的所有素数中最小的一个。 例如,数字6的主除数为2,数字10的主除数为5。

思路

我们可以枚举1到N之间的每一个数字,对于每一个数字,我们可以通过试除法找到它的主除数,并将它与K进行比较。如果相等,则累加计数器。

试除法的时间复杂度为O(sqrt(N)),因此整个算法的时间复杂度为O(N * sqrt(N))。

代码
def count_numbers_less_than_n_with_main_divisor_sum_k(n: int, k: int) -> int:
    """
    计算小于N且主除数之和为K的数字的个数
    :param n: 上限
    :param k: 主除数之和
    :return: 符合条件的数字的个数
    """
    def get_main_divisor(num: int) -> int:
        """
        获取num的主除数
        """
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return i
        return num

    cnt = 0
    for i in range(1, n):
        if sum(set(get_main_divisor(i) for i in range(1, i+1) if i % num == 0)) == k:
            cnt += 1
    return cnt
测试
assert count_numbers_less_than_n_with_main_divisor_sum_k(10, 4) == 2
assert count_numbers_less_than_n_with_main_divisor_sum_k(20, 5) == 4