ABC254

6完。Fが、ギリギリ通せはしたけど、それまで何もわからなかった。Eまではわりとテンポよく取れていたと思う。

A - Last Two Digits

3桁固定なので、文字列として受け取って2文字目と3文字目を出力する。

B - Practical Computing

パスカルの三角形を出力せよという問題なのだろう。数式はあまり読んでない。30段までなので、一番下の段でも和が2^30なのでintで大丈夫。なんかもう二項係数のライブラリ貼ったほうが早い気がしたけど、まあBなので素直に書きましょう。両端は場合分けして1にする。1次元配列で行ける気がしちゃったけどダメだったので2次元に書き直す。時間かかっちゃった。

C - K Swap

パッと見で解けなくてビビる。色々なKで実例をいじっていて気づいたが、添え字のmod Kで分類してその中では自由に並べ替えできて外とは交流できないじゃん。あまり毎に抽出してソートして戻すという操作をして、それで全体としてソートされているかで判定。std::is_sortedの名前を思い出せず自前で実装した。

D - Together Square

積が平方数かが重要なので、各数について持っている素因数の偶奇の情報だけでいい。奇数個ある素因数が何かという集合を作ってそれが一致するもの同士を掛けると平方数になる。その集合の情報をどう持つかで少し悩んだが、単に奇数個の素因数の積でよかった(素数ってそういうものだしNは超えないし)。それをソートしてランレングスとって個数の2乗の和が答え(mapで数えてもいいけど(解説見たけどN以下だから普通にカウントできるやんけ))。

E - Small d and k

次数が3以下であることをどう使うんだ?ハチャメチャに難しいのでは?と思っていたらk_iも3以下だった。雑に見積もってもそういう頂点は3^3個くらいしかない(実際は1+2+4+8で2^4-1が最大か)。BFSすればいいが、必要なところで止める実装が瞬時には浮かばないし、そもそもできればDFSで済ませたい。深さ3までDFSをする。訪問済みフラグにはクエリ番号を入れれば毎回の初期化が要らない。さて、DFSでは、最短距離はわからない。が、到達すれば距離3以下だし、距離3以下の頂点に到達できないということも起こらないだろう。ところが、サンプルを試すと答えが小さく出力されてしまう。確かにそこはすっきり理解できてなかったので、親も含め(ほんとは親は要らないだろうけど)訪問済みも全部探索して和をとるところだけ訪問済みは除くようにして通した。コンテスト中は時間がないので疑問点を考えるのは泣く泣く後回し。今考えると、最短距離を更新したときは訪問済みでも次のノードを展開する必要があった。

F - Rectangle GCD

不可能だろってずっと言ってた。A側3 9、B側5 5で答えが2になる。例えば、15が公約数かを判定したいとき、mod 15でA側が全部7、B側が全部8だったらOK。全部7で揃っていても相手が8でないといけない。単に区間GCDを持っておくとかでは足りない。差の最小値とか重要そうだけど、それが公約数になっているかはわからない。区間が大きい(色々な数が入ってる)ときは答えが小さくなるからその約数を試せたりするのかな。なぜかみんな通してるんだけど、本当に全く解ける気がしなかった。自分が解けないというより、解ける問題である気がしなかった。間際になって、差のGCDを思いつく。確かに、公約数はこれの約数になっていそうだ。7+8=15みたいに合ってるかの部分は、単に矩形領域に含まれる数の一つとGCDをとれば?なんかそれっぽいので提出してAC。logが2つ付いてるの最初は意識してたけど提出するときは忘れてたし、そもそもlog1つみたいなものだということはコンテスト後に思い出した。kyopro_friends解説の変形の仕方はなるほどだけど見えにくいなあ。