JAG Practice Contest for ACM-ICPC Asia Regional 2017 C- Prime-Factor Prime
第一感で時間が厳しそうと思ったけど、ぜんぜん厳しくなかった。相変わらず計算量は難しい。素数の逆数和や素因数の個数の和がなかなか増加しないところがポイントか。
以下、主に計算量について。Δ:=r−lとする。
- 前処理でrまでの素数を列挙する。エラトステネスの篩でO(rloglogr)。
- 次に{l,l+1,...,r}をrまでの素数でふるう。各整数を素数で割れるだけ割りながら、素因数の数を数えていく。
- ループの回数はエラトステネスの篩と同様な見積もりが可能で、∑p≤r,pは素数Δ/p=O(Δloglogr)となる。
- ただし、素因数を数えるために各整数を素数で割っていく操作をO(1)とはみなせないのが問題……だが、Prime omega functionを見る限り、{l,l+1,...,r}内の整数の素因数の数を合計するとO(Δloglogr)でよさそうなので、結局計算量は変わらないはず。(自信なし)
- {l,l+1,...,r}内の整数の素因数の数をすべて数え終わったら、それが素数であるものを数えていく。前処理で作った素数テーブルを使えばよい。O(Δ)。
まとめると、おそらくO((r+Δ)loglogr)になるのだが、自信がない。n∈{l,l+1,...,r}の素因数の数は高々log2rなので、O(rloglogr+Δlogr)なのは間違いない。