Pairwise Coprime Segments

2 secs 1024 MB
milkcoffee's icon milkcoffee

解説

この問題は、「素因数分解」「鳩ノ巣原理」を利用して解くことができます。

数列 AA が区間 [L,R][L,R] において「pairwise coprime」であるとは、
「任意の素数 pp に対して、ALA_L ,,, \ldots , ARA_R の中に pp の倍数は高々11個である」と同値です。
pp の倍数が複数あれば、それらの gcd\mathrm{gcd}pp の倍数となり、「pairwise coprime」ではなくなる。
また、「pairwise coprime」でなければ、gcd(Ai,Aj)>1\mathrm{gcd}(A_i, A_j)>1 となる AiA_iAjA_j はともに gcd(Ai,Aj)\mathrm{gcd}(A_i, A_j) の素因数の倍数になる。)

よって、数列 AA の各要素を素因数分解し、区間 [L,R][L,R] において(異なる要素に)重複する素因数があるかを調べれば良いです。
実装では、map などを用いて各素数に番号を割り振ると良いです。

素因数分解は、各整数 O(Ai)O(\sqrt A_{i}) で行うことができます。
(エラトステネスの篩を用いた方法により、前処理 O(AmaxloglogAmax)O(A_{\max} \log \log A_{\max})、各整数 O(logAi)O(\log A_i) で行うことも出来ます。)

また、2Ai2 \leq A_i より各整数は 11 個以上の素因数を持ちます。数列 AA に含まれる素因数の種類数を ww とすると、
鳩ノ巣原理より、長さが ww を超える区間では必ず素因数が重複します。
重複が発生した時点でクエリの探索を終了することで、各クエリ O(w)O(w) で処理することができます。
Ai104A_i \leq 10^4 であるため、 ww は最大でも 12291229 です。

全体として、「各要素の素因数分解」「各素数へ番号の割り振り」「各クエリの処理」を行うため、
O(NAmax+wlogw+Qw)O(N\sqrt A_{\max}+w\log w+Qw) で問題を解くことが出来ます。


この問題の解法や原案の一部は mts さんの協力によるものです。ありがとうございます。