加载中...

数论分块

简要补充数论分块的相关知识

数论分块含义:对于给定 \(n\),可以按照 \(\lfloor \frac{n}{i}\rfloor\) 相同的区间 \(i\in[l,r]\),将区间 \([1,n]\) 分成多个块(显然块的长度从左往右快速增长)。

有用的几个结论:

  1. 对于 \(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\) 块。
  1. 对于 \(\forall x\),可快速求得 \(x\) 所在块的右端点 \(r\)\(r = \lfloor \frac{n}{\lfloor\frac{n}{x}\rfloor}\rfloor\)

  2. 对于向上取整 \(\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);
    }
} 

oi-wiki

posted @ 2025-07-13 00:46  jxs123  阅读(30)  评论(0)    收藏  举报