现在开始天晴了!|

sunzz3183

园龄:5年2个月粉丝:10关注:25

整数分块学习笔记

整数分块学习笔记

——by sunzz3183


引入

i=1nni

正常求法:

直接枚举每个 n,时间复杂度为 O(n)

可是,如果 1n108 呢?

所以,我们要用到分块的思想:整数分块

整数分块

显然

1lrn,ni=nj(li,jr)

我们会浪费很多的时间。

那么,有多少段相等呢?

我们来看一张图

显然,存在一个 k 使得

nl=k

并让

r=nk

ni=nj(li,jr)

而显然 k 是由 l 得到,r 是由 k 得到。

所以,我们去枚举 l,并让 k,r 等于上面的东西。

而下一段区间的 lr+1

每一段的值为

nl(rl+1)

时间复杂度 O(n)

代码

int division_block(int n){
   int sum=0;
   for(int l=1,r;l<=n;l=r+1)
       r=n/(n/l),sum+=n/l*(r-l+1);
   return sum;
}

本文作者:sunzz3183

本文链接:https://www.cnblogs.com/sunzz3183/p/17190497.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   sunzz3183  阅读(29)  评论(0编辑  收藏  举报
Live2D
欢迎阅读『整数分块学习笔记』
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起