butch’s blog

メモ置き場。

【ABC】 181 D - Hachi

文字列に含まれる数字の順番を入れ替えて8の倍数が作れるかどうかを判定する問題です。

atcoder.jp

1000が8の倍数で割り切れるのがポイントです。
1000が8の倍数で割り切れるので当然それより桁の大きい10000も8で割り切れます。
つまり並べ替えた数列の下3桁が8の倍数かどうかを調べれば良いです。
0が含まれる場合を除いた8の倍数を全て列挙して各桁で必要な数字の個数を格納したdictを用意しました。
例えば

dict[168] = {1:1, 6:1, 8:1}
dict[888] = {8:3}

みたいな感じです。
問題で与えられたSに含まれる数字ごとの個数をカウントして上のdictのどれかよりも多ければYesに、少なければNoにします。
桁数が1桁と2桁の場合だけ例外処理を施しています。

全体のコードは以下にUpしています。

github.com

提出結果

atcoder.jp

ABC181でようやく緑色になりました。
かなりギリギリですがw

atcoder.jp

E問題も方針はある程度立ったのですが、1箇所だけ計算量的に不味そうな点があってsubmitできませんでした。