整除分块学习笔记

整除分块:

1.算法概念:

对于这样一个式子:

\[\sum_{i=1}^{n}\left \lfloor \frac{n}{i} \right \rfloor\]

我们通过对答案分布进行理性的证明分析愉快的暴力打表可以发现答案分布为块状,所以我们可以用整除分块实现

\[O(log(n))\]

的快速求出答案。

2.算法实现:

#include<cstdio>
#include<algorithm>
using namespace std;
long long ans=0,n; 
int main(){
    scanf("%lld",&n);
    for(long long l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        ans+=(r-l+1)*(n/l);
    }
    printf("%lld",ans);
    return 0;
}

3.算法应用:

可以维护一些函数的前缀和(例如莫比乌斯)

posted @ 2019-08-08 20:28  CodeHelper  阅读(119)  评论(0编辑  收藏  举报