2019年4月1日月曜日

ABC 007 D - 禁止された数字

ABC 007 D - 禁止された数字

桁DPはこれで4問目なのだが、今回も盛大にバグらせてしまった。漸化式を立てる際に境界を間違えてしまうのはさしあたり仕方ないとして、デバッグの時間はもっと短くできるはず。使っているメモ化マクロにトレース機能をつけるのが良さそう。

g(x)g(x){0,1,...,x}\{0, 1, ..., x\}中の禁止された数の総数とすると、求める数はg(B)g(A1)g(B)-g(A-1)である。fx(p,d,limit)f_x(p, d, limit)を桁数ppで最上桁の数字がddであるような数(d=0d=0のとき、000003のような表現を許す)のうちの、禁止された数字の総数とする。ただし、limit=0limit=0なら数は自由に選べ、11ならxxを超えないようなものに限定して数えるとする。このとき、g(x)=fx(20,0,1)g(x) = f_x(20, 0, 1)であり、DPすれば求まる。

わかりにくい式でDPしてしまったように思える。4か9が既に現れたかどうかだけ見ればよいらしいので、あとで解き直すかも。