E - Super Lucky Sequence

2 secs 1024 MB
Yourein's icon Yourein

Editorial

数列のii項目まで決めたとき、i+1i+1項目を決める操作は以下のような式で表すことができます。

  • ii項目までを10進整数と見たときの値をAiA_i, 次の項をai+1a_{i+1}とするとAi+1=10A+ai+1A_{i+1} = 10A + a_{i+1}

また、合同式の性質より以下が成り立ちます。

  • ある整数a,ba, bについてab(modK)a \equiv b \pmod{K}ならば任意の整数ccにおいてacbc(modK),a+cb+c(modK)ac \equiv bc \pmod{K}, \hspace{0.5em} a+c\equiv b+c \pmod{K}

このような事実より、ii項目まで決めるときにAi1A_{i-1}までをKKで割ったあまりだけを見ていけば良いということがわかります。
よって、以下のようなDPテーブルを得ます。

  • dp[i][j]=i\mathrm{dp}[i][j] = i項目まで決めたときにKKで割ったあまりがjjとなることはあるか?

また、以下のような遷移式を考えます。

  • dp[i][j]=1\mathrm{dp}[i][j] = 1ならばdp[i+1][(10j+a1)%K], dp[i+1][(10j+a2)%K], ..., dp[i+1][(10j+aM)%K]=1\mathrm{dp}[i+1][(10j+a_1)\%K], \ \mathrm{dp}[i+1][(10j+a_2)\%K], \ ... , \ \mathrm{dp}[i+1][(10j+a_M)\%K] = 1
  • dp[i][j]=0\mathrm{dp}[i][j] = 0ならば何もしない

答えはdp[i][0]=1\mathrm{dp}[i][0] = 1となる最大のiiです。

したがってO(NK)O(NK)でこの問題が解けました。N,KN,Kは最大でも10310^3と小さいのでNKNK回の計算でも十分高速です。

ここではDPをしていますが一項前までで作れる数のmodK\mod Kでの値をsetなどで持っておく、BFS的に実装するというようなことも可能です。
以下にC++での実装例を示していますが、dp[i1][j]=i(i1)\mathrm{dp}[i-1][j] = i(i \ge 1)項目まで決めたときの...としていることに注意してください。

類題 : ABC240_C - Jumping Takahashi

実装例(C++)