数论分块学习笔记

模板#

给定一个正整数 n,其中 n109,考虑求

i=1nni

我们可以直接模拟,时间复杂度 O(n)

但这样显然无法通过这个问题。

思想#

我们把 n=10 的情况列出来:

101=10,102=5,103=3,104=2,105=2,

106=1,107=1,108=1,109=1,1010=1

容易发现,对于一些不同的 i,有相同的 ni,我们可不可以把这些相同的部分一并计算来降低时间复杂度呢?

显然是可以的。

我们把这些有相同 ni 值的区间称为一个块,那么问题在于我们如何找到块长,或者说块的左右端点。

假设我们已知某个块的左端点 l,求解块的右端点 r

记有整数 k=ni(i[l,r]),表示这个块的数值。

显然有

k=ni=nl

i×kn,那么我们可以发现,当 i=r 时,r×k 的值最大且 r×kn

那么有:

r=nk

又因为有:

k=nl

代入得:

r=nnl

Code#

long long H(int n) {
    long long res = 0;
    if(n == 0)
        return 0;
    int l = 1,r;
    while(l <= n) {
        r = n / (n / l);
        res += 1ll * (r - l + 1) * (n / l);
        l = r + 1;
    }
    return res;
}

性质#

ni 最多只有 2n 种取值。

证明:对于 in,最多有 n 种取值;而对于 i>n,有 ni<n,所以也最多只有 n 种取值,所以最多也只有 2n 种取值。

练习#

UVA11526 H(n)(模板题)

[CQOI2007] 余数求和

END

作者:白简

出处:https://www.cnblogs.com/baijian0212/p/zhengchufenkuai.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   -白简-  阅读(32)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu