整除分块

(以下的除号皆表示整除)

用数论函数计算的时候,总会遇到这样一种问题: \(\sum_{i=1}^n f(\frac{n}{i})\)\(O(n)\) 求往往无法满足需要。

但是打表可以发现, n/i 的取值对于一段连续的 i 是一致的, 那么可以考虑一块一块求。

设已知当前块的左端点为 l ,如果知道右端点 r(左闭右开),意味着 \(\forall l<=i<r, \frac{n}{i} = \frac{n}{l}\) , 这一块对答案的贡献就是 \((r-l) \times f(\frac{n}{l})\)

结论是 \(r = n / (n / l) + 1\)

证明:

  • 对于 l 设 \(n / l = x\)
  • 那么由 \(n \bmod l = n - n / l \cdot l = n - l \cdot x\) 可知 $ n - l x $
  • 那么若 \(l + 1\) 满足 \(n / (l + 1) = n / l\) ,可知也有 \(n - (l + 1) \cdot x \geq 0\)
  • \(n - l \cdot x \geq x\)
  • 对于 k 若 \(n / k = n / l\)\(n / (k + 1) != n / l\)
  • 那么根据上式可得 k 满足 $ 0 n - k x < x$
  • 所以 \(n - k \cdot x = n \bmod x = n - n / x \cdot x\)
  • 所以 \(k = n / x = n / (n / l)\)
  • 由 k 的定义 \(n / k = n / l \& n / (k + 1) != n / l\) 可知 k+1 即是要求的 r

那么可以枚举块,当前 l,r 可以求得,下一个块的 l 显然是当前 r。

有时候会有点变化:

要求 \(\sum_{i=1}^{min(n, m)} f(\frac{n}{i}) \cdot f(\frac{m}{i})\)

还是会存在 \(\forall l \le i < r, \frac{n}{i} = \frac{n}{l} \& \frac{m}{i} = \frac{m}{l}\)

所以这样的区间的右端点为:\(r = min(n / (n / l), m / (m / l)) + 1\)

所以还是可以一块一块的枚举求和。