题目大意
对于一个
m
位的十进制整数
g(x)=∑m−1i=0ai
定义集合
Sn={x|0<g(x)≤n}
给出 n ,求下面这个式子
n≤1018
分析
一开始看这题的时候不小心把 g(x) 里的 ∑ 看成了 ∏ 。囧
剩下的就是数位DP了。
记
cntx
表示数位和为
x
的数的个数,
通过枚举当前位选什么,不难写出递推式
lineari=∑9j=110⋅lineari−j+j⋅cnti−j
squarei=∑9j=1100⋅squarei−j+20j⋅lineari−j+j2cnti−j
发现三个状态的转移都只与最近 9 位有关,将它们压成矩阵,用矩阵快速幂转移即可。
时间复杂度