在群里看到一道算法题 题目如下:
求 1<=i<=10**12 范围内所有 d(i)的和的末 12 位, d(i)表示 i 的正约数的和, i 为整数
因为我本人对非科班 算法导论买回来拿去垫杯子了(书:怪我咯) 就看了一点冒泡 桶排 快排 啥的 什么 leetcode 都没有刷过,纯粹小白。
当时想法很简单
整理一下思路就是:
现在面临的问题是:
我看到知乎上有优化算法,期待大神能够帮我解释一下: 如图:
按图索骥好像看到这样一些结论:
在一个大于 1 的数 a 和它的 2 倍之间(即区间(a, 2a]中)必存在至少一个素数。
存在任意长度的素数等差数列。(格林和陶哲轩, 2004 年)
顺便说一下 现在进群的要求不低啊 开学我要回去拿回我的垫杯书 囧
1
Xs0ul 2017-01-25 23:55:43 +08:00 1
你的第一个图应该就能解释是怎么优化的,第二个图挂了不知道是啥。
证明反而麻烦,我就拿个例子来解释好了。方便说明,我把 i 的范围改成 1 ~ 4 (看懂了就知道 10^12 同理)。 约数有: 1 : 1 , 2 : 1 , 2 , 3 : 1 , 3 , 4 : 1 , 2 , 4 式子的第一项,求和方法是 (1) + (1 + 2) + (1 + 3) + (1 + 2 + 4) = 15 而优化的方法,也就是第二项 /第三项,求和方法是 (1 * 4) + (2 * 2) + (3 * 1) + (4 * 1) = 15 。乘法中左边是 1 ~ 4 ,右边是 [4 / i]。 归根结底,是改变了求和的顺序。实际上,所有 d 的倍数,在求和的时候都会被加一次(作为 1d 、 2d ……[10^12 / d]d 的约数),一共就是 [10^12 / d] 次。优化的方法好处就是,不必花时间去找约数,而求约数是相当费力的一件事。 |
2
mickeyandkaka 2017-01-26 00:00:40 +08:00 1
|
3
slysly759 OP @mickeyandkaka ~ ~ thx
|