ARC118

レーティング微増ではあるけど、悔しさ。恐怖に裏打ちされた慎重さを前提としてスピードを出したい(まあ高望みっぽい)。いいセットだったよ。

A - Tax Included Price

よくあるやつだけど、そこを問われるのかあ。簡単そうだけど具体的に解けって言われると焦るよね。100円のものを買って税込み110円なら、0円からそこまでの間に現れない金額が10個あるはず。二分探索だ。N番目のものを求めるには、税込みでN円以上高くなる最初の税込み価格から1を引く。これできれいに求まっている。さっさと提出してAC。こんな短時間でこの問題に関する広範な理解を持つことはできないが、ともかく正しいコードであることがある程度の確度でわかればいい。コンテスト中に使うそのバランスが、いいものを出せることが増えてきた、ような気もする。

B - Village of M People

Cも読みつつ考える。見た目はかなり怖そうなんだけど、勇気を出して突っ込んで考えてみると案外解けてしまうものだった。まず、Aを超えない範囲でBに配る(合計が100%未満になる)。これはM*A_i/N(切り捨て)でいい。Bの側は1/Mずつしか動かせないので、選択肢は少ない。逆にAより少なくないように配ると合計は100%以上になるので、その間に答えはある(その間以外だと1/M以上のズレが生じるが、間なら1/M以下になる)。あとは貪欲にズレが大きいものから1個ずつ足して100%にするだけ。ズレが大きいものほど1個足したときのズレが小さくなるので都合がいい。

C - Coprime Set

素数をいくつか列挙してそのうち1個だけを含まないものを数列の要素にすればいいのではと考える。しかしNが2500と大きいのでこの方法は使えない。そうなると、2*3と2*5と3*5をベースにして条件を満たすように数を追加していく方針になる。2の倍数ならいいかというと、3*5と共通の素因数を持ってないといけないからだめで、6の倍数なら大丈夫。しかし10000以下しか使えない制約というのが厳しい。少し工夫するだけでいけそうではある。ベースとなる三角形から一方向に腕を伸ばすのではなく、3方向全部伸ばそう。2,3,5のうち2個を持っていれば追加できる。最初腕毎にやろうとしたが、まず三角形を完成させる必要があるのでforの順番が逆だった。ぐるぐる回りながら10000以下を追加していく。2500を入力して出力されるのでOK(当時はよくわかっていなかったが、長さ2500の数列を(順番に注意して)生成して最初のN個を出力すればいいという問題なのだ)。提出、WA。普通に同じ数が複数入ってて草。ダブりを愚直にチェックしながら入れるようにしてAC。

D - Hamiltonian Cycle

原始根を1個求めて、a,bがそれの何乗かを計算する(c,dとする)。最初は、aが何乗して初めて1になるかを求めていたが、原始根をとれば楽。あとは足し引きの問題になる。1個だけで達成できるなら簡単だし、そうでなくてc,dのgcdが1でないならNo。そうでないとき、互いに素なので達成できそうではある。てきとうに書くと全部網羅はできてそうだが1に戻ってこない。どっちもP-1の約数なので、1列カバーしてずらしてまた1列みたいな。偶数だったら行って戻ってとかできないかなとか。でもわからなかった。わからないのは仕方ないとして、ここまで来るのに時間がかかりすぎている。