geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC249 参加記録

コンテスト中AC:A〜D

D - Index Trio

 \frac{A_i}{A_j} =A_kを変形すると、A_i = A_jA_kとなります。
A_iを固定すると、A_j,A_kA_iの約数の組に限定されます。
よって、A_1,...,A_Nについて、1\leq d \leq \lfloor \sqrt{A_i} \rfloorである約数dについてのみ調べれば良く、各A_iについて、O(\sqrt{A_i})で全探索できます。

計算量は、Aの最大値をA_{max} として、O(N\sqrt{A_{max}})となり、間に合うか微妙なところですが大丈夫でした。

A_i=d\times \frac{A_i}{d}となる組が何通りあるかですが、
cnt_{x}Aに出現するxの個数とすると、

cnt_{d} \times cnt_{ \frac{A_i}{d}}

となります。
これは、A_j = dとなる全てのA_jに対して、A_k =  \frac{A_i}{d}となるA_kと組を作ることができるためです。

1\leq d \leq \lfloor \sqrt{A_i} \rfloorであるdについて組を計算するわけですが、 d\neq  \frac{A_i}{d}である場合、組の順序を入れ替えると別の組になるので、2倍します。
逆に、d =  \frac{A_i}{d}の場合は入れ替えてできる組は同じなので、2倍しません。

提出コード Submission #31196140 - Monoxer Programming Contest 2022(AtCoder Beginner Contest 249)

なお、計算量を落とすことが可能です。
1,2,...,A_{max}の全てについて、エラトステネスの篩と同じ方法で、試し割り不要で約数が記録された二次元配列を得ることが可能です。
計算量はO(A_{max}logA_{max})となり、二次元配列のサイズも同様にA_{max}logA_{max}となると考えられます。

組の計算にかかる計算量ですが、

blog.hamayanhamayan.com

上記に高度合成数の言及がありますが、ある整数X以下の約数の個数が最大となるのが高度合成数です。
A_{max}が全て2\times 10^5以下の高度合成数Kであった場合が最悪となり、O(NK)です。

高度合成数の一覧 (10^18 以下) | アルゴ式

上記によれば2\times 10^5以下の高度合成数の約数の個数は160個なので、問題ないです。

Submission #31257209 - Monoxer Programming Contest 2022(AtCoder Beginner Contest 249)