AtCoder Grand Contest 025
AtCoder Grand Contest 025に参加しました!
AGC025 旧版:
agc025.contest.atcoder.jp
AGC025 beta:
https://beta.atcoder.jp/contests/agc025/beta.atcoder.jp
解けた問題だけ解説をしていきますー
要項
AtCoder Grand Contest 025
rated
6/3(日) 21:00 ~ 23:10 (130分)
200-700-700-800-1500-2400 (6問)
ペナルティ: 5分
方針
4完を目標に、解ける問題から順に解いていく
配点にそこまで差はないから、多分問題ジャンルが大きく異なるセットと予想
A - Digits Sum
まず、とに対しと分かっているから、を固定するとは一意に定まります。
この時桁の和はで求まるので全体でで求めることができます。
なおちゃんと考察すればなら、そうでないならの各桁の和に等しいのでで求まることが分かりますが今回は不要ですかね。
ちなみに、各桁の……と言われた時はstring型とかにして各桁を取り出すと楽らしいです。
この方法の時、答えがになるなら代わりにを出力する形式で上の条件分けも達成できます。
B - RGB Coloring
変数が複数ある時は、幾つかを固定して考えてみましょう。
まず、入出力例1から分かるように各色の個数を考える必要があります。
そこで、美しさがになるような色の個数を考えましょう。
これはかつを満たすを求めれば良いので、を固定するとは一意に定まることからで求められます。
次に、が求まっているときのタワーの塗り方を考えます。
これは、個の中から個を塗る方法と個の中から個を塗る方法の積に等しいですね。
何故なら、緑を忘れて考えると赤色と青色を個のブロックに塗り、緑色は両方で塗られた場合と考えることができるからです。
さて、個の中から個を塗る方法は通りです。
ここでこれがコンビネーションの導出であること、またで割った余り……つまりとするとは素数なので素数で割った余りなことに注目しましょう。
であり、前もってからを求めておくと計算しやすいです。
であることを利用すればこれは下準備で導出できます。
フェルマーの小定理より(は素数)であることを利用し、からはで導出できます。
次にを利用してからも下準備で導出できます。
これら下準備をすることで、をで導出できることから、全体でで解くことができます。
競プロではやのような素数は頻繁に使うことを考えると、逆元とコンビネーションに関するライブラリは作っておいて損はないでしょう。
C - Interval Game
先に問題文を整理しましょう。
高橋君の移動は、必ず指定された区間の左端か右端の内近い方に移動する、あるいは(既に区間内なので)移動しないの3通りしかあり得ません。
ということは、最小値の最大化問題とかではなく、単に最大のパターンを出す問題であることが分かります。
まず、ある方向に2回連続で動くことはないことを考えます(最初に使った区間が無駄になるだけです!)
ということは毎回移動方向が切り替わるので、2回の移動を1セットとして考えましょう。
また、移動距離が0の区間を抽出することも無駄なので、移動しないパターンは無視するようにします。
次に、この1セットではなるべく移動したいと考えられるので、移動区間が最も長くなるような配置を考えます。
左側の移動位置を、右側の移動位置をとします。
また、においてとします。
この時、移動距離を計算するととなります。
0の場合分けを外すためにあえて区間を追加することで、簡単な総和で解くことができます。
また、条件を鑑みるとを降順に、を昇順にしておけば順番にを満たすものを取っていくだけで求められることが分かります。
同じ区間を2回取る問題に関しては区間ではより不適なので場合分けせずとも弾かれます。
結果
ooxxxx 2完(900点) 29:34(1WA)
316位 パフォーマンス: 2022
レート: 1826→ 1847(+21)
感想
えーC問題は解くべき問題でしたね、考察不足で反省。
また、D問題ですが条件が2つ、範囲がなので各条件で半分以上を残す……つまり二部マッチングの多い方を残すという発想に至らなかった点は反省です。
Dに関しては二部マッチングを避けていたのが悪いので精進します。
ただ、二部マッチングを使わずともこれは構築ゲーなのでシンプルな解答があると考えられます。
Dに関しては、奇数の形に持ち込むことで各マスについて点の存在をで数学的に解ける気がするので挑み直したいなー