数论分块

引入

  对于函数f(d)=nd,d,nN+,dn,我们希望对它求和:i=1nf(i)。于是我们可以对其进行累加,时间复杂度为O(N)

  但是是否会有效率更高的计算方式?我们令n=10

i 1 2 3 4 5 6 7 8 9 10
f(i)=ni 10 5 3 2 2 1 1 1 1 1

  可以发现f(i)函数值相同时的参数i连成了一个区块(i=6,7,8,9,10时,f(i)=1),所以我们可以通过对i的区间进行分块,以求降低时间复杂度。


 

正文

  定理一(时间复杂度)

  |{nd,d,nN+,dn}|2×n(其中|{A}|为集合A的元素个数)

  证明

    当d>n时,f(d)<nf(d)最多只有n个值

    当dn时,f(d)有且只有n个不同的值

    理由如下:

    假设有两个不同的d1,d2,其对应的f(d1)=nd1,f(d2)=nd2相等

    而nd1=nd1+r1(0r1<1),nd2=nd2+r2(0r2<1)

    所以两式相减得:

    |n(1d11d2)|=|r1r2|(0,1)

    不妨令d1>d2,则当d1=n,d2=n1时,上式取得最小值nn(n1)111n>1

    矛盾

    综上,证毕

  结论

    最多存在2n个块,因此算法时间复杂度为O(n)

  定理二(边界的确定)

      使得nd=ni,n,d,iN+,dn成立的imax=nnd

  证明

    设nd=x,则n=dx+r(0r<d)

    所以ndx,即dnx

    所以imax=dmax=nx=nnd

    证毕

  结论

    每个块的右边界可以由块中的数求得,通过使右边界加一可以得到下一个数块的左边界。


__EOF__

本文作者登峰造极
本文链接https://www.cnblogs.com/nulidejuruo/p/18475229.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   蒟蒻121  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示