数论分块
简要补充数论分块的相关知识
数论分块含义:对于给定 \(n\),可以按照 \(\lfloor \frac{n}{i}\rfloor\) 相同的区间 \(i\in[l,r]\),将区间 \([1,n]\) 分成多个块(显然块的长度从左往右快速增长)。
有用的几个结论:
- 对于 \(i\in[1,n]\),区间 \([1,n]\) 最多分成 \(2\sqrt n\) 块。
- 证明:
- (1) \(i\in[1,\sqrt n]\) 时,\(i\) 只有 \(\sqrt n\) 种取值, \(\lfloor \frac{n}{i}\rfloor\) 的取值只有 \(\sqrt n\) 种。
- (2) \(i\in(\sqrt n,n]\) 时,\(\lfloor \frac{n}{i}\rfloor \in[1,\sqrt n]\),\(\lfloor \frac{n}{i}\rfloor\) 的取值只有 \(\sqrt n\) 种。
综上,\(\lfloor \frac{n}{i}\rfloor\) 的取值只有 \(2\sqrt n\) 种,块数最多为 \(2\sqrt n\) 块。
-
对于 \(\forall x\),可快速求得 \(x\) 所在块的右端点 \(r\):\(r = \lfloor \frac{n}{\lfloor\frac{n}{x}\rfloor}\rfloor\) 。
-
对于向上取整 \(\lceil \frac{n}{i}\rceil\) 的数论分块:由于 \(\lceil \frac{n}{i}\rceil = \lfloor \frac{n+i-1}{i}\rfloor = \lfloor \frac{n-1}{i}\rfloor + 1\),因此 \(\lceil \frac{n}{i}\rceil\) 的分块结构与 \(\lfloor \frac{n-1}{i}\rfloor\) 的分块结构相一致,只是对应取值相差1。(需注意 \(i=n\) 时分母c\((n-1) / i\)c为 \(0\),需要作特殊处理)
实用代码:对于 \(n\) 的 \(O(2\sqrt n)\) 个整除分块,从左向右遍历所有块(\(l\) 是块的左端点,\(r\) 是块的右端点):
for(int l = 1, r; l <= n; l = r + 1){ // 枚举每个块的左端点
// ...
r = n / (n / l);
}
上取整数论分块:
for(int l = 1, r; l <= n; l = r + 1){
// ...
if((n - 1) / l == 0){ // 注意上取整数论分块的分子要减1
break;
}
else{
r = (n - 1) / ((n - 1) / l);
}
}

浙公网安备 33010602011771号