数论分块
大部分内容来源于OI-WIKI
引理1: \(\\forall a,b,c\in\mathbb{Z},\left\lfloor\frac{a}{bc}\right\rfloor=\left\lfloor\frac{\left\lfloor\frac{a}{b}\right\rfloor}{c}\right\rfloor\)
引理2: \(\lfloor \frac{n}{i} \rfloor\) 的取值有 \(O(\sqrt n)\) 种
引理 1 可以把一些分母搬上去, 转化成引理 2 的形式。 考虑引理 2 的式子的性质, 这启发我们计算 \(\sum \frac{n}{i}\) 时
可以快速统计。
有一个结论: 取值为 \(\large\frac{n}{l}\) 的最大的 \(i\) 等于 \(\large\lfloor \frac{n}{\lfloor\frac{n}{l}\rfloor} \rfloor\)。
所以我们就可以这么算 \(\large\sum \frac{n}{i}\) :
int Sum(int x) {
int l = 1, r = 0, res = 0;
while(l <= x) {
r = x / (x / l);
res += (r - l + 1) * (x / l);
l = r + 1;
}
return res;
}
拓展的, 当我们需要计算 \(\large\sum f_i \times \frac{n}{i}\)时:
可以把 res += (r - l + 1) * (x / l);
替换成 res += (f[r] - f[l - 1]) * (x / l);
。
再拓展地: 取值为 \(\large\frac{n}{l}\) 的最大的 \(i\) 为 \(\large\lfloor \frac{n - 1}{\lfloor\frac{n - 1}{l}\rfloor} \rfloor\)。
不严谨的证明:
引理4: \(\left\lceil\dfrac ni\right\rceil=\left\lfloor\dfrac{n-1}i\right\rfloor+1\)
证明: \(\left\lfloor\dfrac{n-1}i\right\rfloor+1 = \left\lfloor\dfrac{n-1 + i}i\right\rfloor\), 考虑 $\dfrac{i - 1}{i} < 1 $, 所以易得前面的式子成立。
所以 \(\large\left\lceil\dfrac ni\right\rceil\) 分的块和 \(\left\lfloor\dfrac{n-1}i\right\rfloor\) 分的块一致。
标签:lfloor,right,frac,21,分块,数论,dfrac,rfloor,left From: https://www.cnblogs.com/qerrj/p/18236010