P4492 [HAOI2018] 苹果树

· · 个人记录

题目链接

考虑从朴素的 DP 来导出更优的 \Theta(n) 解法。面对这样一个递推:

f_{i,j}=j\times f_{i-1,j-1}+(i-j-1)\times f_{i-1,j}+[j=1]i!

根据解迭代列的一些经验,自然是考虑设 F_i(x)\{ f_{i,j}\}_{j=0}^i 的生成函数,就表示为:

F_i(x)=(x^2-x)F_{i-1}'(x)+(i-1+x)F_{i-1}(x)+i!x

注意,我们并不需要实际算出 F_n(x) 的系数,答案只是

\sum_{j=1}^nf_{n,j}\times j(n-j)=(n-1)F_n'(1)-F_n''(1)

接下来的做法用到了递推式中非常强的一个性质,请看:

F_i(1)=iF_{i-1}(1)+i!

发现了吧:F_i(1) 的计算不依赖于任意 F_t'(1)。而对于高阶的导数值,计算也不依赖于更高阶的(这是因为 F_{i-1}'(x) 这一项具有系数 (x^2-x),每次求导后含有高阶导的那一项还会带着此系数,这就导致代入 x=1 后此项被消去 )。于是我们只需要对等式两边求导,就可以直接找到递推式:

F_i'(1)=(i+1)F_{i-1}'(1)+F_{i-1}(1)+i! F_i''(1)=4F_{i-1}'(1)+(i+2)F_{i-1}''(1)

有显然的边界值 F_1(1)=F_1'(1)=1F_1''(1)=0。直接计算的时间复杂度就是 \Theta(n) 的。比较有意思的是,不同于一般用到的整式递推,这里是不需要求逆元的。