ARC114

ABCの3完。もう少しやれたのではないかと思ってしまう。

A - Not coprime

昨日のABC195Fっぽさがある。50以下の素数は15個なので2^15通りを全探索。愚直にgcdが1になるものがあるかチェック。

B - Special Subsets

部分群(群ではない)みたいなこと言ってて怖いけど。条件を満たすものは置換になっている。他のと合わせてもやっぱり置換。サイクルの個数がわかればいい。以前探索したものに当たったら終わりで、現在探索中の親に当たったらサイクルとしてカウント。最後に、空集合(自明に条件を満たす)を除く。yukicoderで実戦投入したatcoder/modintをAtCoder本番でも使用した。

(解説を見て)連結成分の個数でいいのか。「尻尾は考えなくていい」とは思ってそれは使ったけど、そこまでは洞察できない。

C - Sequence Scores

まずは最小回数の求め方から。その中でも数え上げに適したものを使いたい。とりあえず数列に出現する値毎に連続してそれ以上のところを塗る感じ。13343みたいなやつで3はまとめて塗れる。2で塗る必要がないのが厄介。色々考えたが、各 l, r, v の組についてM^N回中何回出現するかをカウントする方針を思いついてそこへ行った。愚直3乗が書ける。その区間をvで塗る条件は、全部v以上で、1個はv(「全部v+1以上」ではない)で、隣がv未満。これの高速化だが、よく見ると塗る区間の幅が同じなら回数も同じだ(ある程度実装することでこういうのが見えやすくなる)。端が厄介なので場合分け(どうせO(N)回しかないので計算量は大丈夫)。5000^2はけっこう重いのでpowのlogを避けるため5000^2くらいの(vのw乗が何になるかの)テーブルを作る。テーブルを作るときにnとmを間違えたところがあってサンプル通らずかなり悩んだ。それを除いても実装にかなりの時間をかけてしまった。ACしたけど実行時間が889msもかかってびっくり。

E - Paper Cutting 2

ずっとEをやっていた。シンプルな問題設定なのに難しいらしくて、詰将棋でいうところの「思わず解いてみたくなる好形」だ。黒マス2つで作られる長方形の外側を削っていく感じ。上下左右の削れるマス数だけが重要そう。10^5で変数が4つあるので普通のDPは無理そう。とりあえず黒マスを分断するケースはないものとして期待値を計算してみる。12312341212みたいになってて、3を選んだら12312[34]1212のように取り除く感じ。目を瞑ってイメージすると、ぶどう狩りみたいに4つぶら下がっててランダムな位置でちぎる(そこから下を全部取る)。1つであれば、長さが10^5でも期待値は計算できそうだ。長さが0,1,2,...,n-1について計算済みのとき、1回の操作でランダムにそのn個のどれかになる。つまりそこまでの平均+1だ。これは順番に計算できる。で、4つあっても独立に考えられるんじゃないか?単純に足す。しかし、実際には黒マスを分断するケースもあるため、どうしたらいいかわからず時間切れとなった。