短多项式快速幂
求 \((x^1+x^2+...+x^k)^n\) 的各项系数,要求复杂度 \(\Theta(nk)\)。
前置知识
-
复合函数 \(f[g(x)]\) 的求导:
\(f[g(x)]'=f'[g(x)]g'(x)\)
-
“左乘右导,右乘左导”:
\([f(x)g(x)]'=f(x)g(x)'+f(x)'g(x)\)
做法
设 \(F(x)=x^1+x^2+...x^k\),那么要求的就是 \(F(x)^k\)。
有 \(F(x)^{k+1}=F(x)^kF(x)\),两边求导,得到:
\[(k+1)F(x)^kF'(x)=F(x)^kF'(x)+[F(x)^k]'F(x)
\]
\[kF(x)^kF'(x)=[F(x)^k]'F(x)
\]
我们取出 \(x^n\) 的系数,可以得到:
\[k\sum_{i=0}^n F(x)^k[i] \times F'(x)[n-i]=\sum_{i=0}^n [F(x)^k]'[i] \times F(x)[n-i]
\]
\[k\sum_{i=0}^n F(x)^k[i] \times F'(x)[n-i]=\sum_{i=0}^n (i+1) \times F(x)^k[i+1] \times F(x)[n-i]
\]
把右边 \(i=n\) 的部分分离出来后,可以得到:
\[k\sum_{i=0}^n F(x)^k[i] \times F'(x)[n-i]-\sum_{i=0}^{n-1} (i+1) \times F(x)^k[i+1] \times F(x)[n-i]=(n+1) \times F(x)^k[n+1] \times F(x)[0]
\]
不难发现 \(F(x),F'(x)\) 都是可以预处理的,所以这就是一个 \(F(x)^k\) 各项系数的递推式。
设 \(f_i\) 表示 \(F(x)\) 的各项系数,\(g_i\) 表示 \(F'(x)\) 的各项系数,\(h_i\) 表示 \(F(x)^k\) 的各项系数,那么可以写成:
\[k \sum_{i=0}^n h_i \times g_{n-i} - \sum_{i=0}^{n-1} (i+1) \times h_{i+1} \times f_{n-i}=(n+1) \times h_{n+1} \times f_0
\]
如果 \(f_0=0\),看起来不能递推,但是可以得到这个式子:
\[\sum_{i=1}^{n-1} i \times h_{i} \times f_{n-i+1}-k \sum_{i=0}^{n-1} h_i \times g_{n-i}=k \times h_n \times g_0-n \times h_n \times f_1
\]
然后又能快乐递推了。
回到这个问题,如果我们直接递推依然是 \(\Theta(n^2k^2)\) 的,但是这个式子的系数实在是太优美了,随便优化一下就能优化到 \(\Theta(nk)\)。

浙公网安备 33010602011771号