ABC349

5完。今日は、先週のABCの復習にようやく着手できた(は?)。

A - Zero Sum Game

Aとは思えない考察難度。持ち点の総和が0のまま変化しないことに注目する。

B - Commencement

まあ文字をカウントして、その(正の)個数をカウントして、2以外があるか調べる。コード自体はこんな感じで楽に書けるんだろうなと最初からわかってはいる。しかし問題文が何を言っているのかイメージが全くできない。大体の予想はできても、実装に入れるほどのくっきりしたイメージはできない。なんかコンテスト開始前に気づいたら2分前でおしっこに行きそびれたんだけど、ここで行った。そのくらい難しい。戻ってきてじっくり読み直して実装。

C - Airport Code

かなり怖い見た目だが、よく読むと素直な書き方。どちらかの条件を満たすかという問題なので一つずつ判定していけばいい。部分列になってるかの関数を書いておく(この貪欲はDPとかでおなじみ)。TがSの部分列ならYesで、そうでないときTの最初の2文字を取り出した文字列がSの部分列でかつTの末尾が'X'ならYes、そうでないときNo。

サンプル通らず。for (auto &c : t) と書いてTを小文字に変換したつもりがcではなくtに操作していた(コンパイル通るのが怖いところ)。また、Tを小文字に変換したのを忘れて大文字の'X'で判定していた。

D - Divide Interval

セグ木じゃんと思い、自分のセグ木からコードを持ってくる。そのままでACできるわけではないので、正面から考えるか、このコードをいじってなんとかするかで迷う。できそうなので後者を選択。セグ木のノードを観察すると、1段毎にオフセットと倍率が2倍ずつ変化していく。サイズ2^60のセグ木として、普通に処理していく。

E - Weighted Tic-Tac-Toe

9!なら間に合う。普通にネガマックス法で書いていく。手番と得点差と残り手数を持って再帰。得点差は高橋君目線なので、手番が違えば符号反転させて使う。手番から見たスコアを返すことに注意。スコアの最大値求めるのに初期値が0でやばかった(-INFにする)。まあいつものやつ。最初、9手打ってから判定してて危なかった。コード量の半分は三目並べの判定。計算量は問題ないが、一応探索ノード数を出力させて変なことになってないか確認してから提出。

F - Subsequence LCM

アルゴ式の高度合成数を見ると、10^16以下の制約だと4万個以上の約数がありえて間に合わなそう。とりあえず素朴なDPを書く。よくわからないので提出してみたら、TLEじゃなくてWAでびっくりした。Aをintで受け取ってる。書き直したときにintになってしまったのだ。嘘っぽいものを投げ続けていたが、安定のTLE。

10^16で素因数分解させてくるというのは発想になかった。まあ間に合うのはわかるので、あまりよくない思い込みだけど。

(追記)各素因数がMと同じ個数あるかだけが重要で、だからビットで持てるんだね(約数の個数ぶん必要になると思ってた)。このことにコンテスト終了時点で気づいていなかったのは酷い。素因数分解しない前提で考えてたから抜けやすくはあったろうけど。(素因数の種類数をKとして)2^K種類に分類できたらそれぞれの個数だけわかればいいというのも見えにくい。ここまでわかれば、あとは普通にDP。2重ループで自分にはやや見えにくかったが、特に難しいところはない。高速ゼータ変換を使った方法も、各ビットパターンに含まれる個数の和を高速ゼータ変換で求めて、選び方を2のそれ乗で求めて、逆変換でそれぞれの通り数が求まるという自然な流れだった。

(追記2)ユーザー解説で素因数分解しない解法があったのでやった。Mの約数であるようなA_iに対して、各素因数をMと同じ個数持っていなかったら0個に潰してしまう。そういう半端な素因数はA_iとM/A_iの両方に含まれるので、gcdを上手く使うとできる。これをビットで持つために素因数毎に分解したいが、変換後のAで違うもの同士をぶつければgcdで分解していけそうだ。ここは少し考えたが、結局解説の方法が良いということに。分解したリストを持っておいて(最初は空)、リストにあるもので割れるだけ割って残ったものを今度はgcdで調べて、共通部分があったらそれをリストに追加して元の要素はそれ割る(2個に分ける)(A_iを割り切らないものしかないので1が追加されることはない)。リストが完成したとき、素因数毎にバラバラになっている保証はないが問題ない。提出前に解説を読み直して気づいたが、リストの総積がMに足りなければ答えは0通り(あぶなかった)。あとはそのリストを使ってビットに変換して高速ゼータ変換に合流する。まあコンテスト中にできる分量ではないかもしれないが、実際のコンテスト中にはこういうのを思いつきたくて考えていたのだ。解説を書いた人ありがとう。