Sum of Power of Digit Sum

2 secs 1024 MB
loop0919's icon loop0919

解説

整数 xx の十進表記における桁和を ds(x)\operatorname{ds}(x) とします。

求める値を

S=1xNds(x) が素数xKS= \sum_{\substack{1\le x\le N\\ \operatorname{ds}(x)\text{ が素数}}} x^K

とすると、この問題では SmodPQS\bmod PQ を求めます。

P,QP,QP<QP<Q を満たす異なる素数なので、

gcd(P,Q)=1\gcd(P,Q)=1

です。

そこで、まず

SP=SmodPS_P=S\bmod P

SQ=SmodQS_Q=S\bmod Q

をそれぞれ桁 DP で求めます。

最後に、中国剰余定理を用いて SmodPQS\bmod PQ を復元します。

以下では、法を RR として、

R=PR=P

または

R=QR=Q

の場合の答えを求める方法を説明します。同じ処理を P,QP,Q についてそれぞれ行います。


1. 補助変数を導入する

整数 xx の桁和を

s=ds(x)s=\operatorname{ds}(x)

とします。

十進整数とその桁和は法 99 で合同なので、

xs(mod9)x\equiv s\pmod 9

が成り立ちます。

したがって、

u=xs9u=\frac{x-s}{9}

は整数です。

ここで、現在の整数 xx の末尾に数字 dd を追加したとします。

新しい整数 xx' と桁和 ss' は、

x=10x+d,s=s+dx'=10x+d,\qquad s'=s+d

です。

このとき、新しい補助変数 uu' は、

u=xs9=10x+d(s+d)9=10xs9=10xs9+s=10u+s\begin{aligned} u' &=\frac{x'-s'}9\\ &=\frac{10x+d-(s+d)}9\\ &=\frac{10x-s}9\\ &=10\frac{x-s}9+s\\ &=10u+s \end{aligned}

となります。

よって、

u=10u+s\boxed{u'=10u+s}

です。

この式に、追加する数字 dd が含まれていないことが重要です。

なお、ここでの (xs)/9(x-s)/9 は整数上の割り算です。法 RR における 99 の逆元を使っているわけではありません。


2. 桁 DP の状態

NN の桁数を LL とします。

LL 桁未満の整数についても、先頭に 00 を補って LL 桁の整数として扱います。先頭に 00 を補っても桁和は変化しません。

NN の先頭から何桁かを処理した時点で、

dpj[s]dp_j[s]

を次のように定義します。

  • 現在の接頭辞が、NN の同じ長さの接頭辞より小さい
  • 現在の桁和が ss
  • 補助変数が u=(xs)/9u=(x-s)/9

である接頭辞についての uju^j の総和を表すものとします。

すなわち、

dpj[s]=uj(modR)dp_j[s] = \sum u^j \pmod R

です。

必要なのは、

0jK0\le j\le K

の範囲だけです。

特に j=0j=0 のときは、各接頭辞が 11 を寄与するものと考えます。そのため、

dp0[s]dp_0[s]

は、条件を満たす接頭辞の個数です。

一方、まだ NN と完全に一致している接頭辞は常に 11 個しかありません。

そこで、一致している接頭辞については、

  • equal_sum: 現在の桁和
  • equal_u: 現在の umodRu\bmod R

22 つだけを別に管理します。


3. すでに NN より小さい状態からの遷移

現在の桁和が ss である接頭辞を考えます。

次の桁を追加した後の補助変数は、

u=10u+su'=10u+s

です。

したがって、その mm 乗は二項定理より、

(u)m=(10u+s)m=j=0m(mj)(10u)jsmj=j=0m(mj)10jsmjuj\begin{aligned} (u')^m &=(10u+s)^m\\ &=\sum_{j=0}^m \binom mj (10u)^j s^{m-j}\\ &=\sum_{j=0}^m \binom mj 10^j s^{m-j} u^j \end{aligned}

となります。

古い桁和が ss であるすべての接頭辞について、遷移後の (u)m(u')^m を合計した値を Am[s]A_m[s] とすると、

Am[s]=j=0m(mj)10jsmjdpj[s]\boxed{ A_m[s] = \sum_{j=0}^m \binom mj 10^j s^{m-j} dp_j[s] }

です。

この値は、次に追加する数字には依存しません。

次に追加する数字 dd は、

d=0,1,,9d=0,1,\ldots,9

のどれでも選べます。

古い桁和が ss なら、新しい桁和は s+ds+d です。

したがって、新しい桁和が tt である状態について、

ndpm[t]=0d9s+d=tAm[s]=s=t9tAm[s]\begin{aligned} ndp_m[t] &= \sum_{\substack{0\le d\le 9\\s+d=t}} A_m[s]\\ &= \sum_{s=t-9}^{t}A_m[s] \end{aligned}

となります。ただし、存在しない桁和は無視します。

よって、

ndpm[t]=Am[t]+Am[t1]++Am[t9]\boxed{ ndp_m[t] = A_m[t]+A_m[t-1]+\cdots+A_m[t-9] }

です。

これは長さ 1010 の区間和です。

tt11 増やすとき、

  • 新しく Am[t]A_m[t] を加える
  • 範囲外になる Am[t10]A_m[t-10] を引く

ことで更新できるため、スライド窓を用いて各 mm について線形時間で計算できます。


4. NN と一致している状態からの遷移

次に処理する NN の数字を aa とします。

現在まで NN と一致している接頭辞の桁和を seqs_{\mathrm{eq}}、補助変数を uequ_{\mathrm{eq}} とします。

次の桁を追加した後の補助変数は、

unext=10ueq+sequ_{\mathrm{next}} = 10u_{\mathrm{eq}}+s_{\mathrm{eq}}

です。

次の数字として dd を選ぶとき、

  • d<ad<a なら、この桁で初めて NN より小さくなる
  • d=ad=a なら、引き続き NN と一致する
  • d>ad>a なら、NN より大きくなるため選べない

となります。

d<ad<a を選んだ場合、新しい桁和は、

seq+ds_{\mathrm{eq}}+d

です。

また、unextu_{\mathrm{next}}dd に依存しません。

したがって、各

d=0,1,,a1d=0,1,\ldots,a-1

について、

ndpm[seq+d]+=unextmndp_m[s_{\mathrm{eq}}+d] \mathrel{+}= u_{\mathrm{next}}^m

とします。

その後、d=ad=a を選んだ一致状態を、

uequnextu_{\mathrm{eq}}\gets u_{\mathrm{next}} seqseq+as_{\mathrm{eq}}\gets s_{\mathrm{eq}}+a

として次の桁へ引き継ぎます。


5. xKx^K を復元する

補助変数の定義より、

x=9u+sx=9u+s

です。

したがって、二項定理から、

xK=(9u+s)K=j=0K(Kj)(9u)jsKj=j=0K(Kj)9jsKjuj\begin{aligned} x^K &=(9u+s)^K\\ &= \sum_{j=0}^K \binom Kj (9u)^j s^{K-j}\\ &= \sum_{j=0}^K \binom Kj 9^j s^{K-j} u^j \end{aligned}

となります。

よって、桁和が ss である x<Nx<N 全体についての KK 乗和は、

j=0K(Kj)9jsKjdpj[s]\boxed{ \sum_{j=0}^K \binom Kj 9^j s^{K-j} dp_j[s] }

です。

これを、素数である桁和 ss について合計します。


6. NN 自身を加える

DP に格納されているのは、

0x<N0\le x<N

を満たす整数です。

そのため、最後に NN 自身の桁和が素数なら、

NKmodRN^K\bmod R

を答えに加えます。

一致状態として管理していた equal_uequal_sum を使うと、

N=9u+ds(N)N=9u+\operatorname{ds}(N)

なので、

N9equal_u+equal_sum(modR)N\equiv 9\cdot \texttt{equal\_u} +\texttt{equal\_sum} \pmod R

として NmodRN\bmod R を復元できます。

なお、DP には x=0x=0 も含まれます。しかし、00 の桁和は 00 であり素数ではないため、答えには影響しません。

以上の桁 DP により、法 RR における答えを求められます。

この処理を R=PR=PR=QR=Q についてそれぞれ行い、

SP=SmodPS_P=S\bmod P

および

SQ=SmodQS_Q=S\bmod Q

を求めます。


7. 中国剰余定理による復元

次の連立合同式を満たす S0S_0 を求めます。

S0SP(modP)S_0\equiv S_P\pmod P S0SQ(modQ)S_0\equiv S_Q\pmod Q

まず、

S0=SP+PtS_0=S_P+Pt

と置きます。

この式は必ず、

S0SP(modP)S_0\equiv S_P\pmod P

を満たします。

もう一方の条件から、

SP+PtSQ(modQ)S_P+Pt\equiv S_Q\pmod Q

すなわち、

PtSQSP(modQ)Pt\equiv S_Q-S_P\pmod Q

です。

P,QP,Q は異なる素数なので、PP は法 QQ で逆元を持ちます。

したがって、

t(SQSP)P1(modQ)t\equiv (S_Q-S_P)P^{-1} \pmod Q

です。

0t<Q0\le t<Q を満たす代表元を選べば、

S0=SP+P((SQSP)P1modQ)\boxed{ S_0 = S_P + P\left( (S_Q-S_P)P^{-1}\bmod Q \right) }

となります。

QQ は素数なので、フェルマーの小定理から、

P1PQ2(modQ)P^{-1}\equiv P^{Q-2}\pmod Q

です。

また、

0SP<P,0t<Q0\le S_P<P,\qquad 0\le t<Q

なので、

0S0<PQ0\le S_0<PQ

です。

したがって、この S0S_0 がそのまま SmodPQS\bmod PQ の答えになります。


正当性の証明

補題 1

整数 xx の桁和を ss、補助変数を

u=xs9u=\frac{x-s}{9}

とする。

xx の末尾に数字 dd を追加した後の補助変数は、

u=10u+su'=10u+s

である。

証明

新しい整数と桁和は、

x=10x+d,s=s+dx'=10x+d,\qquad s'=s+d

なので、

u=xs9=10x+d(s+d)9=10xs9=10xs9+s=10u+s\begin{aligned} u' &=\frac{x'-s'}9\\ &=\frac{10x+d-(s+d)}9\\ &=\frac{10x-s}9\\ &=10\frac{x-s}9+s\\ &=10u+s \end{aligned}

です。

よって成立します。\square


補題 2

すでに NN より小さい接頭辞からの遷移後、ndpm[t]ndp_m[t] は、新しい桁和が tt である接頭辞についての (u)m(u')^m の総和になる。

証明

古い桁和が ss である状態では、補題 1 より、

u=10u+su'=10u+s

です。

二項定理から、

(u)m=j=0m(mj)10jsmjuj(u')^m = \sum_{j=0}^m \binom mj 10^j s^{m-j} u^j

なので、古い桁和が ss であるすべての状態について合計すると、

Am[s]=j=0m(mj)10jsmjdpj[s]A_m[s] = \sum_{j=0}^m \binom mj 10^j s^{m-j} dp_j[s]

が得られます。

次の数字 dd00 から 99 まで自由に選べ、新しい桁和は s+ds+d です。

したがって、新しい桁和が tt になるすべての遷移の総和は、

s=t9tAm[s]\sum_{s=t-9}^{t}A_m[s]

です。

これは ndpm[t]ndp_m[t] の計算と一致します。\square


補題 3

各桁の処理後、DP は NN の同じ長さの接頭辞より小さい接頭辞を、重複も不足もなく表している。

証明

処理した桁数についての帰納法で示します。

00 桁を処理した時点では、NN より小さい接頭辞は存在せず、空の接頭辞が NN と一致している状態だけが存在します。

ある桁数まで主張が成立していると仮定します。

すでに NN より小さい接頭辞については、次の数字として 0,1,,90,1,\ldots,9 のすべてを選べます。これらは補題 2 の遷移によってすべて DP に追加されます。

一方、NN と一致している接頭辞について、次の NN の数字を aa とすると、

  • d<ad<a を選んだものは、新たに NN より小さくなる
  • d=ad=a を選んだものは、引き続き NN と一致する
  • d>ad>a を選んだものは、NN を超えるため除外される

となります。

各接頭辞がどの遷移から生成されるかは一意なので、重複も不足もありません。

よって、次の桁を処理した後についても主張が成立します。\square


補題 4

calc_mod は、求める総和を法 RR で正しく計算する。

証明

補題 3 より、すべての桁を処理した後の DP は、

0x<N0\le x<N

を満たすすべての整数を正しく表しています。

各整数について、

x=9u+sx=9u+s

であるため、

xK=j=0K(Kj)9jsKjujx^K = \sum_{j=0}^K \binom Kj 9^j s^{K-j} u^j

と展開できます。

DP は各 uju^j の総和を保持しているので、この式から、桁和が ss である整数の KK 乗和を正しく復元できます。

素数である桁和 ss だけを合計するため、条件を満たす x<Nx<N のみが答えに加算されます。

さらに、NN 自身の桁和が素数である場合に限り NKN^K を加えるため、条件を満たすすべての 1xN1\le x\le N がちょうど一度ずつ数えられます。

よって、calc_mod は求める総和を法 RR で正しく計算します。\square


補題 5

中国剰余定理によって復元した値 S0S_0 は、求める総和と法 PQPQ で合同である。

証明

構成から、

S0SPS(modP)S_0\equiv S_P\equiv S\pmod P

および、

S0SQS(modQ)S_0\equiv S_Q\equiv S\pmod Q

です。

P,QP,Q は互いに素なので、中国剰余定理より、この連立合同式の解は法 PQPQ で一意です。

したがって、

S0S(modPQ)S_0\equiv S\pmod{PQ}

です。\square


定理

このアルゴリズムは、桁和が素数である NN 以下の正整数の KK 乗和を、法 PQPQ で正しく求める。

証明

補題 4 より、桁 DP によって SPS_PSQS_Q を正しく求められます。

さらに補題 5 より、それらを中国剰余定理で復元した値は、求める総和と法 PQPQ で合同です。

よって、アルゴリズムは正しいです。\square


計算量

L=NL=|N| とします。

ii 桁を処理した時点で、桁和は高々 9i9i です。そのため、各桁で扱う桁和状態数は O(L)O(L) です。

各桁和 ss について、すべての m,jm,j の組を処理する回数は、

m=0K(m+1)=O(K2)\sum_{m=0}^K(m+1)=O(K^2)

です。

したがって、法を 11 つ固定したときの時間計算量は、

O(K2L2)O(K^2L^2)

です。

これを P,QP,Q22 回行いますが、定数倍が増えるだけなので、全体の時間計算量も、

O(K2L2)\boxed{O(K^2L^2)}

です。

中国剰余定理で必要な逆元の計算には O(logQ)O(\log Q) 時間かかります。

遷移係数を事前計算するため、メモリ使用量は、

O(K2L)\boxed{O(K^2L)}

です。

PPQQ に対する桁 DP は順番に実行するため、両方の DP 配列を同時に保持する必要はありません。

制約では、

L300,K10L\le 300,\qquad K\le 10

です。


想定解コード(Python)