高速な素因数分解
問題
題材は以下の問題です。
https://codeforces.com/contest/1047/problem/C
概要
ある数 を素因数分解をするとき、通常は までの素数で順に割ればよい。これは計算量 で求めることができる。
今回の場合は、配列 に含まれる のすべての数について素因数分解する必要がある。通常の方法で素因数分解すると となって 1sec の制約だと TLE してしまう。複数の数を高速に素因数分解する手段が必要である。
minFactor[i] := に含まれる最小の素因数
とすると、これは事前に [1, MAX] のそれぞれの数 について minFactor[i] を求めておくことで、数 を素因数分解する際に、minFactor[i] を用いて の素因数のみによって割っていくことができる。したがって通常の素因数分解よりも高速に素因数分解することができる。(ただしメモリの制約上 MAX の値が 程度までにおさまる必要がある)
例えば、 を素因数分解する場合は、以下の表をもとに
→ / minFactor[18] = → / minFactor[9] = → / minFactor[3] →
となって は と を素因数にもつことがわかる。素因数分解する場合は minFactor[i] で割った回数を保持しておけばいい。
minFactor[i] | |
---|---|
- | |
- | |
参考
雑記
この素因数分解の方法、天才ですね・・・