关于除数求和

除数求和函数 \(\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

posted @ 2024-08-05 18:51  一粒夸克  阅读(26)  评论(0编辑  收藏  举报