CADDi 2018 for Beginners
25分で全完したら🥉3位🥉/1314位でした
いくらrated(緑以下)のみ参加OKのコンテストとはいえrated内1桁、しかも3位だったので解き終わってから順位表観てたまげました
A - 12/22
問題: A - 12/22
コンテスト中は10で割ったあまりが2かどうかを見ては2で割って、というのを0になるまで繰り返してあまりが2だった回数を出力すればいい、というふうに解いた。
今考えれば入力が4桁だけなので入力をstringで受け付けて各桁2かどうかでやってもよかったかもしれない
拙解1 (コンテスト中, C++): Submission #3837598 - CADDi 2018 for Beginners
拙解2 (コンテスト後, C++): Submission #3851486 - CADDi 2018 for Beginners
B - AtCoder Alloy
問題: B - AtCoder Alloy
向きを変えられない、ということは単純にを満たすの数を数えるだけ。
C - Product and GCD
問題: C - Product and GCD
はすべて正の整数になるので、の素因数分解の指数を各に分配する問題に帰着できる。
なので、を因数分解して指数をで割った商をまた底の上に乗せれば、の素因数分解が求まる。
つまり、
というふうに素因数分解したとすると
とするときに、の最大公約数を最大にしたいなら、それぞれのについてを大きくする必要がある。
なので、なるべく均等に分配すると、その最大値はとなる。よって、
これで解けた。コード読んで頂いたほうが分かりやすいと思う。
D - Harlequin
問題: D - Harlequin
木が多いと問題が難しく思えるが、1本だけだった場合を考えると、自分が先攻で固定なので、最初のりんごを食べる前に木になっているりんごの数が奇数だと勝ち、偶数だと負けとわかる。
木が複数本ある場合に拡張すると、奇数個のりんごがなっている木をすべて選んでりんごを食べるのが最適戦略になる。なぜならば、そうすれば相手の選択肢はすべて偶数個のりんごがなっている木となり、最後のひとつ*1を食べることができず、相手は絶対に勝てない。よって、自分が先に食べ始めるのが決まっているので、最初に食べたときにすべての木のりんごの個数を偶数にできれば勝ちが確定する。
よって、最初木になっているりんごの数がすべて偶数ならばルンルンの勝ち、ひとつでも奇数があれば自分の勝ち。なので、これを実装すればいい。あまりに実装が軽くてコンテスト中はWAを覚悟したが無事通ったのでよかった。
まとめ
Beginner(緑以下限定コンテスト)とはいえ3位でしかも賞金出るのはうれしすぎる、CADDiさんに感謝するしかない
上限パフォでしたがすでに緑上位なのでギリギリ水色に行きませんでした
書いてる現在は完全に図に乗ってます(緑コーダーなのに)、chokudaiさんの学部1年の時の経験のミニチュア版みたいなものが体験できました
参考:(大学時代の前半のところ)
chokudai.hatenablog.com
*1:1は奇数