请教一道算法题~ - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slysly759

请教一道算法题~

  •  
  •   slysly759 2017 年 1 月 25 日 2579 次点击
    这是一个创建于 3376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    在群里看到一道算法题 题目如下:

    求 1<=i<=10**12 范围内所有 d(i)的和的末 12 位, d(i)表示 i 的正约数的和, i 为整数

    因为我本人对非科班 算法导论买回来拿去垫杯子了(书:怪我咯) 就看了一点冒泡 桶排 快排 啥的 什么 leetcode 都没有刷过,纯粹小白。

    当时想法很简单

    1. 数字很大,很多,排序我就用桶吧
    2. 自然数由 0 , 1 素数和合数构成 (小学课本写的。。) 后来我发现 合数可以由 多个乘积构成 也就是我要找到素数列表 然后组合成为所有 0-10**12 的自然数就好了

    整理一下思路就是:

    1. 在遍历的过程中判断该数字是否为素数,是就放进素数列表,否就是合数,我需要写一个方法来解析这个合数
    2. 合数由多个素数的乘积构成比如 6=2^1 * 3^1 这样构成 因此可以通过遍历素数列表 看能否余数为零,为零我就在其基础上加一 变成{6 :{2:1,3:1,5:0}} 这样一个映射表
    3. 再循环过程中根据质数和定律自动计算并求和

    现在面临的问题是:

    1. 跑到 10000 就需要 38 秒 这样算下来看起来需要到明年,这个算法还是很耿直

    我看到知乎上有优化算法,期待大神能够帮我解释一下: 如图:

    按图索骥好像看到这样一些结论:

    在一个大于 1 的数 a 和它的 2 倍之间(即区间(a, 2a]中)必存在至少一个素数。

    存在任意长度的素数等差数列。(格林和陶哲轩, 2004 年)

    顺便说一下 现在进群的要求不低啊 开学我要回去拿回我的垫杯书

    4 条回复    2017-01-26 13:31:48 +08:00
    Xs0ul
        1
    Xs0ul  
       2017 年 1 月 25 日   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] 次。优化的方法好处就是,不必花时间去找约数,而求约数是相当费力的一件事。
    valuedlute
        2
    valuedlute  
       2017 年 1 月 26 日   1
    http://blog.csdn.net/skywalkert/article/details/50500009

    d(i)是积性函数,答案可以在 n^(2/3)的时间得到。

    不用谢。
    slysly759
        3
    slysly759  
    OP
       2017 年 1 月 26 日
    @mickeyandkaka ~ ~ thx
    slysly759
        4
    slysly759  
    OP
       2017 年 1 月 26 日
    @Xs0ul 谢谢 我的理解更深了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     878 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 20:49 PVG 04:49 LAX 13:49 JFK 16:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86