多项式与生成函数
由于快速傅里叶变换并不在 CCF 的考纲之内,故对于多项式的考察仅限于公式推导。
即使是只剩下公式推导,多项式仍然是一个强大的工具。
多项式暴力全家桶
以下很多东西是在 mod xc 意义下定义的,不过推导过程并不需要用到 c,比较神奇。
加法 数乘 卷积
暴力模拟即可。
加法复杂度 max(n,m),数乘复杂度 n,卷积复杂度 nm。
求导
ai′=(i+1)ai+1,注意这会丢掉常数项。
积分
ai′=iai−1。
求逆
其实就是 ∀n,∑iAiBn−i=[n=0]。
不妨设 n>0,把 A0 拿出来:
A0Bn=−i=1∑nAiBn−iBn=A0−∑i=1nAiBn−i
边界是 B0=A01,这也告诉我们多项式存在逆的条件是 A0=0。
递推即可,复杂度 O(cn)(c 为模数 xc 的指数),这也告诉我们两个多项式相除复杂度必须至少是分母的平方。
多项式相除就是多计算一次卷积,复杂度 O(cn+cm)。
实际上我们不必求逆再相乘,可以进一步求多项式除法:
∀n,i∑Ai(AB)n−i=BnA0(AB)n=Bn−i=1∑nAi(AB)n−i(AB)n=A0Bn−∑i=1nAi(AB)n−i
然后你发现这个东西就变成 O(cm)(m 为分母次数)的了,这也告诉我们多项式除单项式还是能做的。
你可能会举出退背包的例子告诉我这可以做到 O(nm),那岂不是求逆复杂度直接变成 O(n),乐。
事实上这里的退背包取决于你想要多长的数组,也就是 c,你至少要保证答案数组长度 ≤c。
ln/exp
注意多项式存在 ln 的条件是 [x0]F(x)=1,小时候看这集兴奋地说解决了离散对数求解难题。
多项式存在 exp 的条件是 [x0]F(x)=0。
令 G(z)=lnF(z),对两边求导,得:
G′(z)=F(z)F′(z),G(z)=∫dzF(z)F′(z)
令 G(z)=expF(z),两边求导,得:
G′(z)=G(z)F′(z)
展开 F(x),G(x) 系数序列为 A,B:
(n+1)Bn+1Bn=i=0∑nBn−i(i+1)Ai+1=n1i=1∑niAiBn−i