3匹の猫

みみねこの競プロ精進メモ

AtCoder Regular Contest 117参加記(~C問題)

600点問題が解けると嬉しい!!
f:id:mmnkblog:20210418231705p:plain

A - God Sequence

各要素が正の整数である二つの数列a, bを考えることにする。この時、数列aの要素の総和と数列bの要素の総和が等しくなれば良い。A=Bのとき明らかに、a_i = b_iとすることで条件を満たすことができる。

A\lt B(数列aより数列bの方が長い)と仮定する。(逆ならswapする)
この時数列bの要素をb_i = iとなるように決めると、数列aの最後の要素を除いてa_i = iとし、最後の要素をa_A = \sum_{k=A}^{B} kとすることで条件を満たすことができる。最後の要素で数値を調整するイメージ。

計算量はO(A+B)

B - ARC Wrecker

階数が同じビルがあった場合、どんな操作をしてもそれらのビルの階数は等しいままである。よって回数が同じビルはひとまとめにしておく。以降、すべてのA_iに重複が無いものとして考える。ついでに数列Aを昇順に並び替えておく。

Xとして選ぶ数字は数列Aの要素のどれかとしてよい。また、X=A_iとしたとき、少なくともA_iの値は1減るため、A_iは最大でもA_i回しか選べない。

実験するとわかるが、操作の順番は結果に関係しない。つまり「各iについて、X=A_iを何回選ぶか」という情報だけわかればよい。さらに、X=A_iとした場合、i \le jを満たすすべてのjについて、A_jの値は1減る。先ほど昇順にソートした理由はこれで、A_iが小さい順から「何回A_iを選ぶか」を決めていくことで数え上げることができる。

XA_ik回選ぶとすると、A_iA_{i+1}は共にkずつ減る。A_iの値が変わらないようなXA_{i+1}を選ぶ回数の最大値は、(A_{i+1} - k) - (A_i - k) + 1 = A_{i+1} - A_i + 1回である。この数値はkによらず一定である。
よって(A_1 + 1)\times \prod_{ i = 1 }^{N-1} (A_{i+1} - A_i + 1)が答え。計算量はソートがボトルネックとなり、O(N\log N)

C - Tricolor Pyramid

文字を選ぶ操作をなにかの演算として表現したい。各文字を0, 1,  2で置き換えて演算結果を表にまとめる。二つの数をa, bとしたとき、演算結果は -(a+b)\bmod 3と表せる。

左からi番目の整数をa_iとすると、最上段の整数に含まれる各a_iの個数は二項係数を用いて表せる。具体的に、最上段の整数は(-1)^{N-1} \times \sum_{i=1}^{N} ({}_{N-1} \mathrm{ C }_i \times a_i) \bmod 3である。なので素直にこの式を計算すればよいが、\bmod 3上の{}_{N-1} \mathrm{ C }_iの値を求める方法がわからなかった。

http://www.junko-k.com/collo/collo29.htm
上のサイトを見ながら考えたところ、N-13^kで割った余りで場合分けすることでO(\log N)で求められることに気が付いた。なのでその場合分けを丁寧に書いて計算し解答。計算量はO(N\log N)

ちなみにコンテスト後にTwitterを眺めていたところ、この方法は「Lucasの定理」という名前がついていて、3進数での各桁の数字をもとにして計算するらしい。コンテスト中に定理を導出した自分すげえ!(素直)

感想

最強学生コンで失ったレートをほとんど取り返したので満足。