高速な素因数分解

問題

題材は以下の問題です。

https://codeforces.com/contest/1047/problem/C

概要

ある数 n素因数分解をするとき、通常は  \sqrt n までの素数で順に割ればよい。これは計算量 \sqrt n で求めることができる。

今回の場合は、配列 a_n に含まれる a_i のすべての数について素因数分解する必要がある。通常の方法で素因数分解すると  O(n \sqrt n) となって 1sec の制約だと TLE してしまう。複数の数を高速に素因数分解する手段が必要である。

minFactor[i] := i に含まれる最小の素因数

とすると、これは事前に [1, MAX] のそれぞれの数 i について minFactor[i] を求めておくことで、数 n素因数分解する際に、minFactor[i] を用いて n の素因数のみによって割っていくことができる。したがって通常の素因数分解よりも高速に素因数分解することができる。(ただしメモリの制約上 MAX の値が 10^8 程度までにおさまる必要がある)


例えば、 18素因数分解する場合は、以下の表をもとに

1818 / minFactor[18] = 99 / minFactor[9] = 33 / minFactor[3] → 1

となって 1823 を素因数にもつことがわかる。素因数分解する場合は minFactor[i] で割った回数を保持しておけばいい。

i minFactor[i]
0 -1
1 -1
2 2
3 3
4 2
5 5
6 2
7 7
8 2
9 3
10 2
11 11
12 2
13 13
14 2
15 3
16 2
17 17
18 2

参考

drken1215.hatenablog.com

雑記

この素因数分解の方法、天才ですね・・・