Many Positive Divisors

2 secs 1024 MB
nasubi24's icon nasubi24

A1,A2,,ANA_1,A_2,\dots,A_N それぞれにおいて素因数分解したものの、素因数ごとの指数の和を求めることができれば、i=1NAi\prod_{i=1}^N A_i の正の約数の個数を求めることができます。
しかし、試し割り法を用いた素因数分解では、整数 MM の素因数分解に O(M )O(\sqrt{M\ }) かかってしまい、間に合いません。(C++ なら間に合うかもしれませんが)
そこで、事前に Bi=iB_i=i の最小の素因数 であるような配列 BB を作ります。これはエラトステネスの篩を用いることで、MM 以下の整数に対応するものを O(M log log M)O(M\ log\ log\ M) で作成することができます。(典型 90 の 30 問目で用いるテクニックと似ています)
この配列 BB を用いて素因数分解を行うことで、整数 MMO(log M)O(log\ M) で素因数分解することができます。
よって、整数列 AA の最大値を MM とすると、この問題を O(N log M + M log log M)O(N\ log\ M\ +\ M\ log\ log\ M) で解くことができました。