整除分块学习笔记
整除分块学习笔记
前言
最近在学习 莫比乌斯反演 ,好像要用到一个小小的知识点: 整除分块
所以为了让大家都能更好地学习莫比乌斯反演,我来水一篇博客
那么正片开始。
整除分块
现在要求一下式子
f
(
n
)
=
∑
i
=
1
n
⌊
n
i
⌋
f(n) = \sum_{i = 1}^n ⌊\frac{n}{i}⌋
f(n)=i=1∑n⌊in⌋
很明显能
O
(
n
)
O(n)
O(n) 做
但是有的时候因为多组数据,可能 O ( n ) O(n) O(n) 并不是正确的时间复杂度。那么这个时候就要用到 O ( n ) O(\sqrt n) O(n) 的 整除分块 了!
对于每一个
⌊
n
i
⌋
⌊\frac{n}{i}⌋
⌊in⌋ 我们可以通过 打表 理性证明可以发现:有一些
⌊
n
i
⌋
⌊\frac{n}{i}⌋
⌊in⌋ 的值都是一样的并且都是连在一起的。
设: d = ⌊ n i ⌋ d = ⌊\frac{n}{i}⌋ d=⌊in⌋ 然后每一块的左端点就是 ⌊ n d + 1 ⌋ + 1 ⌊\frac{n}{d+1}⌋ +1 ⌊d+1n⌋+1 ,右端点是 ⌊ n d ⌋ ⌊\frac{n}{d}⌋ ⌊dn⌋
code
int solve(int n){
int ans=0;
for(int l=1,r;l<=n;l=r+1){
r=n/(n/l);//计算出与l相同值的区间的右端点
ans+=(r-l+1)*f(n/l);
}
}
后记
感觉杜教筛好恶心啊!!!

浙公网安备 33010602011771号