公式

D - Divisibility Power 解説 by hos_lyric


(より詳しい解説は後日ブログで公開します)

\(g(n) := \displaystyle\sum_{m=1}^n f(m)^A\) とします.

\(g(n)\) は包除原理によって,素数 \(p_1 < \cdots < p_l\) を決め打ったとき,\(n\) 以下の \(p_1^2 \cdots p_l^2\) の倍数の個数に,\(l\) に応じた適切な重みをかけたものを合計する,という形で求まります.「適切な重み」は \(0^A, 1^A, \ldots\) から定まり,考えるべき \(l\) は非常に小さいので事前に計算できます (実際には,第 2 種 Stirling 数によって \(l! S(A, l)\) と書けます).

求めたい \(g(n)\)\(g(\lfloor N/z \rfloor)\) という形ですが,\(g(\lfloor N/z \rfloor) = \displaystyle\sum_{x^2 y z \le N} \mathrm{weight}(x)\) というように書けます.

\(x \le N^{1/2}\) は列挙できます (オーダーは変わりませんが, square-free な \(x\) のみ見ればよいです).そして \(y, z\) の大小によって以下の方法を使い分けます:

  • \(y \le z\) については,\(y\) を列挙すると,\(z\) のある範囲について足し込むという形になります.これは差分を管理しておけばよいです.
  • \(y > z\) については,\(z\) を列挙すると,\(\sum_y 1\) は簡単に求まります.

これにより時間計算量 \(O\left( \sum_x (N/x^2)^{1/2} \right) = O(N^{1/2} \log(N))\) を達成できます.

なおこの問題は,\(p^e \mapsto \begin{cases} 1 & (e=1) \\ \exp(X) & (e \ge 2) \end{cases}\) なる乗法的関数の \([X^A/A!]\) を見ていると考えるとわかりやすいかもしれません.

投稿日時:
最終更新: