容易发现若令
F(x)=∑gj,i(x−aj)i 则
F(j)(ai)=j!gi,j。于是问题变成了求出
F(x+ai)modxki 的系数,我们可以把它分解成
F(x)mod(x−ai)ki 和已知
G(x),求出
G(x+ai) 2 步。
G(x+a)=∑gi(x+a)i=∑gi(ji)ai−jxj=∑(i!gi)(i−j)!ai−jj!xj
直接一次差卷积即可解决。
考虑第
1 步,容易得到基于多项式取模的
O(nlognlogm) 做法。类似多项式多点求值地,将
Qi=(x−ai)ki 放在线段树上,自上而下地做多项式取模。
接下来的常数优化也是众所周知的:利用转置原理。介绍一种容易理解的方法(来自
飞雨烟雁
的博客)。
考虑简化多项式取模的操作。
记下标
r 为系数翻转,
n,m 分别为
F,G 的最高次数。
我们有
[xk](FmodG)=∑[xi]F[xk](ximodG)。对其转置,得到
[xk](FmodTG)=∑[xi]F[xi](xkmodG)
可以发现这是在求解一个初值为
[x0]F,[x1]F,⋯,递推系数为
G 的线性递推。而我们知道线性递推可以被另一种方式表达:
Gr(FGr)modxm,所以它也是取模的转置,那么我们可以再转置回来得到多项式取模,得到:
FmodG=((F×TGr−1)modxm)×TGr
于是一切豁然明朗,直接在线段树上维护出子树内的
∏Gr,向下传
(F×TGr−1)modxm 即可。
于是我们在
O(nlognlogm) 的时间复杂度,
O(nlogm) 的空间复杂度内解决了此问题。