短多项式快速幂

做多校的时候碰见了这个技巧,记录下来。只能说高中的时候没有好好学生成函数,现在回看有些东西其实没有那么难的,应该认真地体系地学一下。

假设我们现在有一个 mm 次的多项式:

F(x)=a0+a1x++amxmF(x) = a_0 + a_1 x + \cdots + a_m x^m

我们现在想求 Fk(x)F^k(x)00nn 次项系数。

kk 特别大的时候,如果我们直接用多项式快速幂模板,时间复杂度为 O(mklog(mk)+n)O(m k \log (m k) + n),非常慢。但如果在 m,nm, n 都比较小的情况下,我们可以用一些技巧,让复杂度里直接不带 kk,变为 O(nm)O(n m)

注意到:Fk+1(x)=Fk(x)F(x)F^{k + 1}(x) = F^k(x) F(x),两边求导得到:

(k+1)Fk(x)F(x)=Fk(x)F(x)+(Fk(x))F(x)kFk(x)F(x)=(Fk(x))F(x)(k + 1) F^k(x) F'(x) = F^k(x) F'(x) + (F^k(x))' F(x) \\ k F^k(x) F(x) = (F^k(x))' F(x)

F[i]F[i] 表示多项式 F(x)F(x) 的第 ii 次项系数,将上面的式子对比 pp 次项系数可得:

ki=0pF[i]Fk[pi]=i=0pF[i](pi+1)Fk[pi+1]k \sum_{i = 0}^p F'[i] F^k[p - i] = \sum_{i = 0}^p F[i] \cdot (p - i + 1) F^k[p - i + 1]

将右边 i=0i = 0 的项提出来,移项可得:

(p+1)F[0]Fk[p+1]=ki=0min{p,m}F[i]Fk[pi]i=1min{p,m}F[i](pi+1)Fk[pi+1](p + 1)F[0] \cdot F^k[p + 1] = k \sum_{i = 0}^{\min\{p, m\}} F'[i] F^k[p - i] - \sum_{i = 1}^{\min\{p, m\}} F[i] \cdot (p - i + 1) F^k[p - i + 1]

于是我们就得到了一个关于 Fk[p]F^k[p] 的递推式,预处理 F[i]F'[i] 后就可以 O(nm)O(n m) 时间计算出 Fk(x)F^k(x)00nn 次项系数。