计算复杂度为 O(1) 的 N 以下数字的倍数之和?
Count sum of multiples of a number below N with O(1) complexity?
给定两个数M和N,我们需要统计N以下所有能被M整除的整数之和。
是否可以用 O(1) 复杂度求解?
我知道这是一个非常简单的程序,可以很容易地用一个循环来完成。但是我想知道是否可以应用某种公式或其他东西来直接计算N以下可被M整除的数字的总和。
确实有一个 O(1) 的解决方案:
首先利用整数算法计算n = N / M
。 n
是 等差数列 中第一项和公差等于 M
.
的项数
总和(来自等差级数的公式)是
n * (1 + n) * M / 2
例如,考虑 N = 23,M = 5。你在 5 + 10 + 15 + 20 之后是 50。封闭形式的解决方案计算为 4 * 5 * 5 / 2,这也是 50 .
L:=floor(M/N)
M + 2*M + 3*M + ... + L*M
= M (1+2+3+4+...+L)
这可以通过 wikipedia summation
来解决
= M*(L*(L+1)/2)
这可以在 O(1) 中计算
给定两个数M和N,我们需要统计N以下所有能被M整除的整数之和。
是否可以用 O(1) 复杂度求解?
我知道这是一个非常简单的程序,可以很容易地用一个循环来完成。但是我想知道是否可以应用某种公式或其他东西来直接计算N以下可被M整除的数字的总和。
确实有一个 O(1) 的解决方案:
首先利用整数算法计算n = N / M
。 n
是 等差数列 中第一项和公差等于 M
.
总和(来自等差级数的公式)是
n * (1 + n) * M / 2
例如,考虑 N = 23,M = 5。你在 5 + 10 + 15 + 20 之后是 50。封闭形式的解决方案计算为 4 * 5 * 5 / 2,这也是 50 .
L:=floor(M/N)
M + 2*M + 3*M + ... + L*M
= M (1+2+3+4+...+L)
这可以通过 wikipedia summation
来解决= M*(L*(L+1)/2)
这可以在 O(1) 中计算