【发布时间】:2020-05-19 12:11:48
【问题描述】:
Gine 2 数 N 和 M,将是 [1 到 n] 之间所有不能被 M 整除的数的最大除数之和。例如:- N=10,M=3,那么总和将为41 作为从 1 到 10 的最大除数是 [1, 2, 1, 4, 5, 2, 7, 8, 1, 10],它不能被 3 整除,其和为 41。
【问题讨论】:
Gine 2 数 N 和 M,将是 [1 到 n] 之间所有不能被 M 整除的数的最大除数之和。例如:- N=10,M=3,那么总和将为41 作为从 1 到 10 的最大除数是 [1, 2, 1, 4, 5, 2, 7, 8, 1, 10],它不能被 3 整除,其和为 41。
【问题讨论】:
所以数字 1 到 N 的和是 N(N+1)/2。如果 M > N,这就是答案;否则,我们就高估了。我们多算了多少?我们多算了每个小于或等于 N 的 M 的倍数。让我们试着看看我们多算了多少。我们高估了可被 M 整除的项;它们的总和是 M + 2M + … + floor(N/M)*M。作为第一遍,我们可以减去这个总和,然后将总和除以 M 加回:
M + 2M + … + floor(N/M)*M
= M(1 + 2 + … + floor(N/M))
= M*floor(N/M)*(floor(N/M) + 1)/2
结果表达式:
N(N+1)/2 + (1 - M)*floor(N/M)*(floor(N/M) + 1)/2
这让我们离我们需要的地方更近了。我们只用 k 替换了 kM 形式的所有项。但是,如果 M^2
N(N+1)/2
+ (1 - M)*floor(N/M)*(floor(N/M) + 1)/2
+ (1 - M)*floor(N/M^2)*(floor(N/M^2) + 1)/2
+ …
+ (1 - M)*floor(N/M^k)*(floor(N/M^k) + 1)/2
您可以在 floor(N/M^k) = 0 时终止该过程,即一旦 M^k > N。您的示例:
10(10+1)/2
+ (1 - 3)*floor(10/3)*(floor(10/3) + 1)/2
+ (1 - 3)*floor(10/9)*(floor(10/9) + 1)/2
= 10*11/2
+ -2*3*4/2
+ -2*1*2/2
= 55
- 12
- 2
= 41
您可以非常有效地循环计算它;终止条件是 M 的当前功率大于 N。
【讨论】:
M 不是素数,这种方法是否有效?