AtCoder ABC215

ABC215参加しました。

atcoder.jp

 

A - Your First Judge

解説 - AtCoder Beginner Contest 215
文字列の比較をすればいいです。公式解答が頑張っていろんな言語で書いてるのに驚いた。
C#で解きましたが、入力文字列=="Hello, World!"で問題なし。

B - log2(N)

解説 - AtCoder Beginner Contest 215
(long)Math.Log2(N)だと、精度不足でした。公式解答でも指摘されてますね。
C#だとdecimal使えばいいのかも知れませんが、decimalはlogを取れないようです。

そもそも入力例にあるように、 $ 10^{18} $ でも2のべき乗だと59という小さな値で収まる以上、for文でNを超えない範囲で2倍したほうが、小数も使わないですし楽でした。

やっぱり競プロで小数問題は要注意ですね。

C - One More aab aba baa

解説 - AtCoder Beginner Contest 215
提出 #25260855 - AtCoder Beginner Contest 215

D - aab aba baa という問題をより簡単にしたものだと思いました。辞書式順序問題です。

NextPermutationで解きました。
文字列の長さが8である以上、Kも$8! = 40320$程度で、NextPermutationでK回回しても問題なかったです。

D - Coprime 2

解説 - AtCoder Beginner Contest 215

gcd()と聞くとどうしても苦手な問題きたか、と思ってしまいますが、今回はそうでもなかった。
発想としてはgcd(a,b)=1なら、a,bは互いに素なはずで、今回求めるkは全部素数なのではないかという点から考えました。で、1~Mまでの素数を全部求めて、ただしAに入っている素数だけは除外する、みたいな。
ただ、これだとA={6,1,5}のとき、k=2,3とかが入ってしまうため、どうにかならないかと他の入力例とかを考え始めて、A=(1,5,25)を考えついたときピンときました。

Aに含まれる数のすべての素因数の集合P(hashsetで保持、つまり、同じ要素を2つ含まない)を持っておきます。
あとは、1~Mまでの数で、Pの要素の倍数を除外していきます。

例えばA=(1,5,25)だとP={5}で、1~Mの中で5の倍数は除外します。

素因数を求めるアルゴリズムはライブラリ化してあると楽。

E - Chain Contestant

解説 - AtCoder Beginner Contest 215
提出 #25260829 - AtCoder Beginner Contest 215

bitDP... まだ学習前でした。 なのでここに書けることはほぼない... 一応解説を見て書いたACコートは上げておきます。

まとめ

手元のライブラリに助けられた回でした。 DPはもっと練習が必要。