解説
[0] 準備
以下を前提に解説します。
-
正整数 n に対し d(n) を、 n を十進表記したときの桁数と定義します。
-
i についての任意の式 F(i) について、 l>r ならば i=l∑rF(i)=0 であるとします。
-
f(a,b,c)=a⋅10d(b)+d(c)+b⋅10d(c)+c と表すことができます。
[1] 各 c ごとの寄与
ここで a+b=c の条件から、 c を固定したときの寄与 G(c) は
G(c)=b=1∑c−1f(c−b,b,c)=b=1∑c−1((c−b)⋅10d(b)+d(c)+b⋅10d(c)+c)=10d(c)b=1∑c−1(c−b)10d(b)+10d(c)b=1∑c−1b+cb=1∑c−11=10d(c)b=1∑c−1(c−b)10d(b)+(10d(c)+2)2c(c−1)
と計算できます。
残った b=1∑c−1(c−b)10d(b) について、
- d(c) 桁未満の b はすべて含まれる
- d(c) 桁の b は 10d(c)−1 から c−1 まで含まれる
ことを考慮すると、b が d(c) 桁未満の場合とちょうど d(c) 桁の場合に分ける発想が出ます。
そこで、前計算として
P[x]:=i=1∑10x−110d(i),Q[x]:=i=1∑10x−1i⋅10d(i)
を定義すると、以下のように式変形できます。
b=1∑c−1(c−b)10d(b)=cP[d(c)−1]−Q[d(c)−1]+10d(c)b=10d(c)−1∑c−1(c−b)=cP[d(c)−1]−Q[d(c)−1]+10d(c)⋅2(c−10d(c)−1)(c−10d(c)−1+1)
これにより、固定したある c に対する寄与 G(c) を、適切な前計算のもと求めることができます。
P,Q の前計算について、x 桁の整数は 10x−1 以上 10x−1 以下であるため、
P[x]=P[x−1]+10x⋅9⋅10x−1Q[x]=Q[x−1]+10x+i=10x−1∑10x−1i
と計算できます。
[2] 各寄与を桁ごとに計算
c が q 桁である範囲は Lq=10q−1 以上 Rq=min(N,10q−1) 以下です。
計算のために以下の式を導入します。
S1(n)=i=1∑ni=2n(n+1)S2(n)=i=1∑n2i(i−1)=6n(n+1)(n−1)S3(n)=i=1∑n2i(i+1)=6n(n+1)(n+2)
そうすると、 c の桁数が q 桁であるようなものの寄与の総和 Block(q) は
Block(q)=10q(P[q−1]c=Lq∑Rq−Q[q−1](R−L+1)+10qc=Lq∑Rq2(c−10q−1)(c−10q−1+1))+(10q+2)c=Lq∑Rq2c(c−1)
となり、S1,S2,S3 を用いて
c=Lq∑Rqc=S1(Rq)−S1(Lq−1)c=Lq∑Rq2c(c−1)=S2(Rq)−S2(Lq−1)c=Lq∑Rq2(c−10q−1)(c−10q−1+1)=S3(Rq−10q−1)−S3(Lq−10q−1−1)
と計算することができました。
q=1,2,3,⋯ に対してこの値を求め、それらの総和を 998244353 で割った余りが答えとなります。
これにより、本問題を解くことができました。計算量は O(logN) です。
ここで、計算中に発生する除算は、mod 998244353 上の逆元を用いて計算する必要があることに注意してください。