📅  最后修改于: 2023-12-03 14:53:56.007000             🧑  作者: Mango
本题需要计算小于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