怠惰の累積和

技術/競プロ/怪文書/虚無

AtCoder Beginner Contest 135 D - Digits Parade

問題概要

 文字列Sが与えられる。Sに含まれる?の文字を数字に置き換えて、置き換えた後の文字列を数字と見たとき、13で割ると余りが5になるのは何通りか。

atcoder.jp

 

解法

 当然、「それぞれの?について0~9まで試せばいいだろ!w」ではO(|S|10^N)(N=?の個数)でアなのでだめ。

 なんか問題がDPしろって言っているように思えるのでDPを考えてみる。

 dp(i,j)=i桁目まで見た時、13で割った余りがjになる組み合わせの数

のようなDPを考える。

 Sのi文字目(0≦i<S.length())が?のとき、0~9までの全ての文字について遷移先を計算して、そこに足すと良い。

 最終的な答えは、dp(|S|,5)になる。O(|S|)

atcoder.jp