BoB003-E: Sakky Sequence

2 secs 1024 MB
kyaneko999's icon kyaneko999

解説

以下のような方針は,いずれも N106N\le 10^6 という制約の下では制限時間に間に合わないと思います.

  • A1=XA_1=X として,i=2,3,,Ni=2,3,\dots,N の順に AiA_i を求める.
    Ai=iA_i=i と初期化し,各 j=1,2,,i1j=1,2,\dots,i-1 に対して jjii の約数ならば AiA_iAjA_j をかける.計算量は O(N2)O(N^2)
  • 上記の方針において,jjii の約数であるような jj を求める操作を,素因数分解を用いて高速化する.計算量は O(NN)O(N\sqrt{N})

上記の方針では,「各 ii に対して,ii より小さい jj について, AiA_iAjA_j をかける」という操作を行っていました.
操作の見方を変えて,「各 jj に対して,jj より大きい ii について, AiA_iAjA_j をかける」という操作を行う以下のような方針を考えてみます.

  • j=1,2,,Nj=1,2,\dots,N の順に AjA_j を求める.A1=XA_1=XAj=jA_j=j と初期化しておく.
    jj について i=2j,3j,i=2j,3j,\dots に対して AiA_iAjA_j をかける.

この方針の計算量を評価します.ある jj に対して NN 以下の正の整数のうち jj の倍数であるものの個数は Nj\lfloor\frac{N}{j}\rfloor です.
よって,j=1,2,,Nj=1,2,\dots,N に対して考える場合の計算量は O(N(1+12++1N))O(N(1+\frac{1}{2}+\cdots+\frac{1}{N})) となりますが,これは O(NlogN)O(N\log N) と等しいです(調和級数).
一見すると操作の見方を変えただけですが,計算量が改善されたことにより問題を解くことができます.
これは,約数を探索する場合には素因数分解の際に約数でない数も探索する必要があるため,無駄な計算時間がかかってしまうことに起因します.

解答例(Python)