整除分块学习笔记

整除分块学习笔记

前言

最近在学习 莫比乌斯反演 ,好像要用到一个小小的知识点: 整除分块

所以为了让大家都能更好地学习莫比乌斯反演,我来水一篇博客

那么正片开始。

整除分块

现在要求一下式子
f ( n ) = ∑ i = 1 n ⌊ n i ⌋ f(n) = \sum_{i = 1}^n ⌊\frac{n}{i}⌋ f(n)=i=1nin
很明显能 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);
    }
}

后记

感觉杜教筛好恶心啊!!!

posted @ 2023-05-22 20:10  2020fengziyang  阅读(11)  评论(0)    收藏  举报  来源