跳到主要内容

数论分块

参考资料

简介

数论分块 用于快速计算形如 i=1nf(i)n/i\sum_{i=1}^n f(i)\lfloor n/i\rfloor 的和式。n/i\lfloor n/i\rfloorii 增大只取 O(n)O(\sqrt n) 种不同值,且取同一值的 ii 构成一段连续区间 [l,r][l,r],其右端点为 r=n/n/lr=\lfloor n/\lfloor n/l\rfloor\rfloor。对每段批量累加即可在 O(n)O(\sqrt n) 内完成。

实现

61 Bcpp
for(ll l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans+=(r-l+1)*(n/l);
}

例题

给定 TT 次询问,每次询问一个正整数 nn,求 i=1nni\sum_{i=1}^n\left\lfloor\frac{n}{i}\right\rfloor