盆栽をサボっていたので怒られた問題。
問題
正整数 x に対して、x の桁を逆順にして leading zero を除いたものを f(x) とする。入力 n,m に対し、∑x=110N−1f(x)mmod 998244353 を求める。
問題リンク
https://atcoder.jp/contests/KeioPC2025/tasks/KeioPC2025_e
解法
適当に実験をすると、結局は∑x=110n−1xmmod 998244353 を求めればよいことが分かる。
S(m,k):=1m+2m+...+(10k)m=∑i=110kim として、S(m,n) を求めることを考える。
n≤109 なので愚直には求められないが、m≤106 なので、これを利用して解きたい。S(m,k) は Faulhaber's formula を用いて求めることを考えると、Bernoulli Number が分かればよくて、これは二項係数と畳み込みを適切に用いることで O(mlogm) で求まる。(cf. Bernoulli Number - Library Checker)
観察
n=2 の場合で観察すると、1m,2m,...,10m,11m,...,20m,...,50m,...,99m の総和を求めることになる。便宜上 100m まで足すことを考える。
これらのうち、実際には足されない数は 10 の倍数であるもので、10m,20m,30m,40m,50m,60m,70m,80m,90m,100m である。これらの和は、
i=1∑10(10i)m=10mi=1∑10im=10mS(m,1)
より S(m,1) が求まればよいことが分かる。
x=10,20,...,90 の時に実際に足されるのは 1,2,...,9 であり、これはそれぞれの値を 10 で割ったものに等しい。また、x=100 の時は実際は 1 が足されるが、一旦は 10 が足されるということにしておく。すると、S(m,2)−10mS(m,1)+S(m,1)=S(m,2)−(10m−1)S(m,1) が求められればよい。
現時点で足されているのは 1m,2m,...,9m,1m,11m,...,2m,21m,...,99m,10m である。このうち、実際には足されない数は 10m であり、これについて同様に考えると、(10m−1)S(m,0) が求められればよい。
よって、この時の答えは
S(m,2)−k=0∑1(10m−1)S(m,k)=S(m,2)−(10m−1)k=0∑1S(m,k)
結論 (一般解)
以上より、求める答えは S(m,n)−(10m−1)∑k=0n−1S(m,k) である。以降、∑k=0n−1S(m,k) を高速に求める方法を考える。
S(m,n)=m+11k=0∑m(km+1)Bk(10n)m+1−k
をとりあえず畳み込みの形にすると、
S(m,n)=m!a+b=m+1∑a!Ba⋅b!10nb
であるから、
k=0∑n−1S(m,k)=m!k=0∑n−1a+b=m+1∑a!Ba⋅b!10kb
このままだと計算量に n がかかってしまうので、これをなんとかしたい。
数式をいじいじすると、シグマの順番が交換出来て、
k=0∑n−1S(m,k)=m!a+b=m+1∑a!Ba⋅k=0∑n−1b!10kb
あとは等比数列の和の公式を使えば、
k=0∑n−1S(m,k)=m!a+b=m+1∑a!Ba⋅b!(10b−1)10b(n−1)−1
となり、∑k=0n−1 を消去できた。この値は O(mlogm+mlogn) で計算できそうなので、計算量の問題は解決した。
S(m,n),10m−1 も高速に求められるので、結果として答えを得られる。
感想
ライブラリ盆栽をサボっていなかったら自前のライブラリでなんとかできたと思うので、ライブラリをちゃんと整えたい。終了後に Nyaan's Library からそのままコピペして提出したら AC 出ました。Nyaan さんいつもありがとうございます。
おわり
おわりです。