关于除数求和
除数求和函数 \(\text{Divisor Summatory Function}\) 定义为
\[T(n)=\sum_{i=1}^n\left\lfloor\dfrac ni\right\rfloor
\]
非常简单吧 。
后面讨论的均为多组询问 。
记号约定:\((f(n))−O(g(n))\) 表示 \(O(f(n))\) 复杂度预处理,\(O(g(n))\) 复杂度询问 。
Algorithm -1:暴力,\(O(1)−O(n)\) .
Algorithm 0:每次整除分块,\(O(1)−O(√n)\) .
Algorithm 1:\(O(n)\) 递推,\(O(n)−O(1)\) .
考虑推下式子:
\[\sum\limits_{i=0}^{n}x\bmod i=nx-\sum\limits_{i=1}^{n}i\left\lfloor\frac{x}{i}\right\rfloor
\]
接下来考虑差分,已知 \(T(x-1)\) 求 \(T(x)\):
\[T(x-1)-T(x)=\sum\limits_{i=1}^{n}i\left(\left\lfloor\frac{x}{i}\right\rfloor-\left\lfloor\frac{x-1}{i}\right\rfloor\right)=\sum\limits_{i=1}^{n}i[i\mid x]=\sigma(x)
\]
所以
\[T(x)=\sum\limits_{i=0}^{n}x\bmod i=nx-\sum\limits_{i=1}^{x}\sigma(i)
\]
线性筛出 \(σ(i)\) 的前缀和即可。
Algorithm 2
另一方面,这个是反比例函数下整点个数,根据双曲线对称性,有
\[T(n)=2\sum_{i=1}^{\sqrt n}\left\lfloor\dfrac ni\right\rfloor-\left\lfloor\sqrt n\right\rfloor^2
\]
不过并不能加快复杂度,只能让实现更容易一点 .
其实有魔法可以做到 $O(n^{1/3}) - O(1)$,见 link .
高维情况可以看上面的论文 .
End