📌  相关文章
📜  N除以K的幂的商的总和不超过N(1)

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

N除以K的幂的商的总和不超过N

给定正整数N和K,求满足N除以K的幂的商的总和不超过N的所有正整数序列。

例如,当N=10,K=3时,符合条件的序列为{1, 2, 3, 4, 6, 8, 9},这些数分别是3^0, 3^02^1, 3^1, 3^02^2, 3^12^1, 3^2, 3^02^3。

思路

设f(i)为N除以K的幂的商的总和不超过i的最大值,那么我们可以得到一个递推式:

f(i) = f(i-1) + i/K^(j),其中K^j为小于等于i的最大幂次。

与下一个f(i+1)的关系是:

f(i+1) = f(i) + (i+1)/K^(j+1)

所以可以使用动态规划来解决问题。

代码
def sum_div_by_k_power(n: int, k: int) -> List[int]:
    res = []  # 符合条件的结果序列
    f = [0] * (n + 1)  # 动态规划数组
    for i in range(1, n+1):
        # 求K的幂次
        j = 0
        while k ** (j+1) <= i:
            j += 1
        # 计算f(i)
        f[i] = f[i-1] + i // k ** j
        # 判断是否符合条件
        if f[i] <= n:
            res.append(i)
    return res
测试

输入:n=10,k=3

输出:[1, 2, 3, 4, 6, 8, 9]