从 https://codeforces.com/blog/entry/76447 里面抄一个代数做法。
考虑朴素 dp:记 (f_{i, j} = f_{i - 1, j} + (j + a_i) imes f_{i - 1, j - 1}),不太好做。
做变换 (g_{i, j} = f_{i, i - j}),并记 (b_i = a_i + i),则有 (g_{i,j} = g_{i - 1, j - 1} + (b_i - j) imes g_{i - 1, j})。
其对应的 OGF 满足 (G_i = x(G_{i - 1} - G'_{i - 1}) + b_iG_{i - 1})。
根据高中数学,我们可以构造 (H_i = G_ie^{-x}),则有 (H_i = b_iH_{i-1} - xH'_{i-1})。
注意算子 (vartheta = xfrac{d}{dx}) 只和本位系数有关,也就是说有 (h_{n, j} = h_{0, j} imesprod_i(b_i - j) = frac{(-1)^j}{j!} imesprod_i(b_i - j))。
之后可以分治 fft 算出 (B(x) = prod_i(b_i - x)),然后多点求值求出 (H_n)。
但是在本题中我们只需要算 (sum_i g_{n, i}),是否有更好的方法?
我们知道:
其中 (B_p = [x^p]prod_i(b_i - x)),一样分治 fft 算出。
考虑将 (j^{n - p}) 展开成下降幂形式:
则 (sum_i g_{n, i} = sum_p B_p imes left(sum_i(-1)^i{n - prace i} ight))。接下来只需要计算 (s_{n-p} = sum_i(-1)^i{n - prace i})。
继续用代数做法。设出 EGF:(S(x) = sumfrac{s_i}{i!}x^i)。代入:
[egin{aligned} S(x) =& sum_{i}frac{sum_m(-1)^m{irace m}}{i!}x^i \ =& sum_m(-1)^mleft(sum_{i}frac{{irace m}}{i!}x^i ight) \ =& sum_m(-1)^mfrac{(e^x-1)^m}{m!} \ =& exp(1-e^x)\ end{aligned} ]做个多项式 exp 即可求出。
这真的更优秀吗。