解説
以下のような方針は,いずれも N≤106 という制約の下では制限時間に間に合わないと思います.
- A1=X として,i=2,3,…,N の順に Ai を求める.
Ai=i と初期化し,各 j=1,2,…,i−1 に対して j が i の約数ならば Ai に Aj をかける.計算量は O(N2).
- 上記の方針において,j が i の約数であるような j を求める操作を,素因数分解を用いて高速化する.計算量は O(NN).
上記の方針では,「各 i に対して,i より小さい j について, Ai に Aj をかける」という操作を行っていました.
操作の見方を変えて,「各 j に対して,j より大きい i について, Ai に Aj をかける」という操作を行う以下のような方針を考えてみます.
- j=1,2,…,N の順に Aj を求める.A1=X,Aj=j と初期化しておく.
各 j について i=2j,3j,… に対して Ai に Aj をかける.
この方針の計算量を評価します.ある j に対して N 以下の正の整数のうち j の倍数であるものの個数は ⌊jN⌋ です.
よって,j=1,2,…,N に対して考える場合の計算量は O(N(1+21+⋯+N1)) となりますが,これは O(NlogN) と等しいです(調和級数).
一見すると操作の見方を変えただけですが,計算量が改善されたことにより問題を解くことができます.
これは,約数を探索する場合には素因数分解の際に約数でない数も探索する必要があるため,無駄な計算時間がかかってしまうことに起因します.