数论分块
数论分块
引入
\(f(n)=\sum\limits^{n}_{i=1} \lfloor \frac{n}{i} \rfloor\),给定一个 \(n\) ,求 \(f(n)\) 的值。
需要整除分块的知识。
在给定一个 \(n\) 的前提下,可以发现 \(\lfloor \frac{n}{i} \rfloor\) 的取值在连续一段区间内相同,故可以分为若干块分别进行计算。这就是整除分块的核心思想。
分块数量
给定一个 \(n\) ,设有集合 \(A = \{x | x = \lfloor \frac{n}{i} \rfloor,1 \leq i \leq n,i \in \Zeta \}\),\(card(A) \leq 2\sqrt{n}\)。
这样整除分块的时间复杂度为 \(\Omicron(\sqrt{n})\)。
分块边界
设 \(l\) 为分块左边界,\(r\) 为分块右边界,\(k\) 为这个块的单值,那么 \(k=\lfloor \frac{n}{l} \rfloor\),\(n=k*i+z, z \in [0, k)\),所以 \(i = \frac{n-z}{k}\),可得 \(i \leq \lfloor\frac{n}{k}\rfloor\),即 \(r=\max(i)=\lfloor\frac{n}{k}\rfloor\)。将 \(k=\lfloor \frac{n}{l} \rfloor\) 带入,\(r = \lfloor \frac{n}{ \lfloor \frac{n}{l} \rfloor } \rfloor\)。
所以分块的值为 \(k*(r-l+1)\)。
int separate(int n) {
int res = 0;
int l = 1, r;
while (l <= n) {
r = n / (n / l);
res += 1LL * (r - l + 1) * (n / l);
l = r + 1;
}
return res;
}

浙公网安备 33010602011771号