我们有两个数字M和N。我们需要计算所有小于N的、可以被M整除的整数的总和。
是否有可能用O(1)复杂度解决它?
我知道这是一个非常简单的程序,可以很容易地使用循环来完成。但我想知道是否有可能应用某种公式或其他方法直接计算小于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)
= M*(L*(L+1)/2)
这可以在O(1)的时间复杂度内计算