I - Dividing Game 解説 by rsk0315

O(N + max A) 時間解法

線形篩を使います。

\(i\) (\(1\le i\le M\)) に対して、\(i\) の最小素因数を(全体で)\(O(M)\) 時間で求めることができるデータ構造です。(\(1\) の最小素因数については、文脈に応じて \(1\) としたり \(\infty\) としたりします。)

\(i\) の(重複を含めた)素因数の個数を \(f(i)\)\(i\) の最小素因数を \(\operatorname{lpf}(i)\) と書くと、

\[ f(i) = \begin{cases} 0, & \text{if } i = 1; \\ f(i/{\operatorname{lpf}(i)}) + 1, & \text{if }i \gt 1 \end{cases} \]

が成り立つので、DP によって各 \(f(i)\)\(O(M)\) 時間で求めることができます。

よって、(公式解説 の考察を踏まえて)全体で \(O(N+\max_i A_i)\) 時間で解くことができます。


おまけ:線形篩を使って \(\operatorname{lpf}(i)\) のテーブルを作っておくことで、各 \(1\le i\le M\) の約数の個数なども \(O(M)\) 時間で求めることができます。

記事を書きました

投稿日時:
最終更新: