ABC164 D - Multiple of 2019
解法
ここでは、について下から桁目の数字をと表記します。また、の文字列の長さ、すなわちをとします。
加えて、をで割った余りをと表記します。
まず、について、桁ごとに分解して表現してみると、
となります。
は、次のように書くこともできます。
一般化すると、
ここで、
と定義してあげると、
と
の二つを組み合わせ、累積和のようにしてで計算することができます。
ここで、の桁目から桁目までを取り出した数( )は、これをとして、
が2019の倍数となるには、
となっていればよいです。
2019と は互いに素なので、先ほどの数式のうち分子のみに着目することで、結局
であれば、は2019の倍数ということがわかります。
これをさらに変形すると、
となり、結局
という条件であるようなのペアを探せばよいということがわかりました。
さて、この式は先ほど作成したそのものの式で、
であるようなのペアを探せばよいことになります。
となるようなの個数、という配列を用意しておき、
を計算
を答えに加算
に1加算
という操作を、から繰り返して行けば、答えが求まります。については、取り得る添え字の値がなので、そのサイズだけ確保しておけばよいです。
おまけ
今回のように、とを計算しながら答えを求めていく、というものはほかにもいくつかあります。
は、今回添え字が最大で2019にしかならないのであらかじめ配列を確保しておくことができましたが、そうでない場合でも、列の長さが以下のとき、種類も最大で通りにしかならないことを利用すると、map等を駆使することで計算ができます。
も、単純な累積和でいいもの等があります。
ほかにも、がと互いに素でないケースが存在する問題等ありますので、是非見てみると良いと思います。
類題リスト↓
AGCの200点でかなりの難関といわれた問題です。しかし、今回の問題を知っていれば、おそらく解けると思います。今回のような操作をする問題の解法ツイート等では、この問題名がよくあがります。
コーナーケースに注意しましょう。
少しトリッキーですが、帰着させることができます。