ABC286

6完。

A - Range Swap

幅のぶんだけswap。むずすぎ。Bならいい問題だと思うけどAでこれはねえよ。特に詰まったわけでもないのに俺が2分以上かかってる。

B - Cat

けっこう怖いけどまあ。答えのstringにpush_backしていく。直近がnaであればaを入れる前にyも入れる。naじゃなくてaaとかだったらダブルカウントしてやばいけど。証明せず状況証拠で提出した感じ。

C - Rotate and Palindrome

ハチャメチャに難しそうな見た目だが、トイレに行って落ち着くとrotate回数を固定するだけ(2つの操作は順番を入れ替えてもいい)。実際にrotateしてしまえば楽。

D - Money in Hand

硬貨と聞くだけで怖いが、ただのDP。bitsetを使えば実装も楽。

E - Souvenir

ほんとにこんなんできるの?って感じだが、お土産を無視すればただの最短経路。ということは、直行便のコストをめちゃくちゃ大きくしてそこから行き先のお土産を引けばよさそうだ。この「最短経路」では、同じ都市を二度通ることはない、同じお土産を何回も買うことはない。直行便のコストを2^45とした。移動回数は300回未満なので上も下もめっちゃ余裕。

F - Guess The Number 2

出力する整数列は、要するにM頂点で出次数が全部1の有向グラフだ。そうすると、いろんな長さのループを作っておけば、Nをループの長さで割ったあまりがわかると気づく。10^9以上になるまで素数を小さい順に掛けていくと、なんと和が110をオーバーしてしまう。びっくり。10^9をだいぶ超えてるので何か抜けば行けないかと思ったけど、大きいのを抜いたら10^9未満になるし、小さいのを抜いても和が110以下にならない。

困ったけど、いやこれ中国剰余定理じゃん。なんで素数である必要があると思った。ただ、最小公倍数が10^9以上である必要はあるので同じ素数が別の要素に入っていてはいけない。eに近いほど効率がいいので、まあ5以上は使えなさそう。ということで2と3を2乗して4と9で使ってみると、当たり。ナップサックせずに済んだ(やったらできたのかな)。

あとは上手く実装して最後にatcoder::crtを使う。

(追記)i個目の素数まで見て和がjであるときの積の最大でDP。確かに唯一解。

G - Unique Walk

対象となる辺を頂点のように扱うことを考えていたが、辺には両端があって自由には行き来できないのでそもそも間違っていた。なんか「辺」の本数が2乗になっても数えるだけでいいからこれで行けたと思ったんだけど。で、対象となる辺で区切った連結成分を頂点にしてという方針にして終了間際に出したけど普通にWA。そりゃそうだ。けっこういいとこまで来てる気はするんだけど。

(追記)いやだいぶいいところまで来てたね。辺と頂点として考えていたときの名残りで連結成分に接している辺を数えるとき同じ辺は1回しか数えてなかった。あとはもう全ての辺を1回ずつ通る話になる。上で「そりゃそうだ」と書いたのは、やはり辺と頂点として考えていたからで、(元のグラフの)次数が1の頂点は関係ないだろって思ってしまった(なんで関係なくなるのか今となってはよくわからんが)。