Pairwise Coprime Segments

2 secs 1024 MB
milkcoffee

解説


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

数列 が区間 において「pairwise coprime」であるとは、
「任意の素数 に対して、 の中に の倍数は高々個である」と同値です。
の倍数が複数あれば、それらの の倍数となり、「pairwise coprime」ではなくなる。
また、「pairwise coprime」でなければ、 となる はともに の素因数の倍数になる。)

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

素因数分解は、各整数 で行うことができます。
(エラトステネスの篩を用いた方法により、前処理 、各整数 で行うことも出来ます。)

また、 より各整数は 個以上の素因数を持ちます。数列 に含まれる素因数の種類数を とすると、
鳩ノ巣原理より、長さが を超える区間では必ず素因数が重複します。
重複が発生した時点でクエリの探索を終了することで、各クエリ で処理することができます。
であるため、 は最大でも です。

全体として、「各要素の素因数分解」「各素数へ番号の割り振り」「各クエリの処理」を行うため、
で問題を解くことが出来ます。


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