B3883 [信息与未来 2015] 求回文数 数位dp题解
1前言
作者认为本题是新手联系数位dp的好题
建议先阅读作者主页前一篇关于数位dp的题解
2问题
具体如下图
数据范围这么大!
甚至需要高精度来存储
这个数据范围就是一眼数位dp了,别的算法必定超时
3数位dp-part1-预处理
很容易发现,对于所有 k k k位数,回文数的数量是固定的
易得一位数和两位数的回文数的数量都是 9 9 9(不含0)
考虑 k k k位回文数,其实是 ( k + 1 ) / 2 (k +1)/ 2 (k+1)/2位的数进行对称操作
( k k k为奇数时对称轴为 ( k + 1 ) / 2 (k+1)/2 (k+1)/2位的数,否则为 k / 2 k/2 k/2和 k / 2 + 1 k/2+1 k/2+1位字符的中间)
最外面不能是 0 0 0,那么方案数显然为 9 × 1 0 ( k − 1 ) / 2 9 \times 10^{(k-1)/2} 9×10(k−1)/2
那么设 k k k位数的回文数数量为 f k f_{k} fk
设所有不大于 k k k位,即 1 − − 1 0 k − 1 1--10^{k}-1 1−−10k−1区间内的回文数总数为 s u m k sum_{k} sumk
设 e k = 1 0 k e_{k} = 10^k ek=10k,这个数位dp几乎都要用,不要忘了
即得状态转移方程
f i = 9 × e ( k − 1 ) / 2 f_{i} = 9 \times e_{(k-1)/2} fi=9×e(k−1)/2
s u m i = s u m i − 1 + f i sum_{i} = sum_{i-1}+f_{i} sum