(注:以下为形式幂级数的代数运算,不严格要求收敛性,仅作形式化推导。内容大部分由AI生成,最下方有我的手稿,可能会详细些)
生成函数
对于数列 f\boldsymbol{f}f,定义其 形式幂级数 F(x)\boldsymbol{F(x)}F(x),即:
F(x)=∑i=0+∞fixi F(x) = \sum_{i=0}^{+\infty} f_i x^i F(x)=i=0∑+∞fixi
若仅计算前 nnn 项,可表示为 F(x)mod xn\boldsymbol{F(x) \mod x^n}F(x)modxn(模 xnx^nxn 截断)。
多项式运算中默认 F(x)F(x)F(x) 收敛,F(x)F(x)F(x) 是数列 {fi}\{f_i\}{fi} 的形式化表示。
设两个形式幂级数:
A(x)=∑i=0+∞aixi,B(x)=∑i=0+∞bixi A(x) = \sum_{i=0}^{+\infty} a_i x^i, \quad B(x) = \sum_{i=0}^{+\infty} b_i x^i A(x)=i=0∑+∞aixi,B(x)=i=0∑+∞bixi
1. 相等性
A(x)=B(x) ⟺ ∀i∈N, ai=bi A(x) = B(x) \iff \forall i \in \mathbb{N},\ a_i = b_i A(x)=B(x)⟺∀i∈N, ai=bi
2. 加减运算
A(x)±B(x)=∑i=0+∞(ai±bi)xi A(x) \pm B(x) = \sum_{i=0}^{+\infty} (a_i \pm b_i) x^i A(x)±B(x)=i=0∑+∞(ai±bi)xi
3. 卷积(乘法)运算
(A∗B)(x)=∑i=0+∞(∑j=0iajbi−j)xi (A * B)(x) = \sum_{i=0}^{+\infty} \left( \sum_{j=0}^i a_j b_{i-j} \right) x^i (A∗B)(x)=i=0∑+∞(j=0∑iajbi−j)xi
满足 交换律、结合律、对加法的分配律。
若 (A∗B)(x)≡1(modxn)(A * B)(x) \equiv 1 \pmod{x^n}(A∗B)(x)≡1(modxn),则称 A(x)A(x)A(x) 与 B(x)B(x)B(x) 在 模 xnx^nxn 意义下互为乘法逆元。
4. 导数运算
-
一阶导数:
A′(x)=∑i=0+∞(i+1)ai+1xi(也记为 dAdx(x)) A'(x) = \sum_{i=0}^{+\infty} (i+1) a_{i+1} x^i \quad \text{(也记为 } \dfrac{dA}{dx}(x) \text{)} A′(x)=i=0∑+∞(i+1)ai+1xi(也记为 dxdA(x)) -
高阶导数:
A(k)(x)=(A(k−1)(x))′ A^{(k)}(x) = \left( A^{(k-1)}(x) \right)' A(k)(x)=(A(k−1)(x))′ -
求导法则:
(A+B)′=A′+B′,(AB)′=A′B+AB′ (A + B)' = A' + B', \quad (AB)' = A'B + AB' (A+B)′=A′+B′,(AB)′=A′B+AB′
链式法则:若 C(x)=B(A(x))C(x) = B(A(x))C(x)=B(A(x)),则
dCdx=dBdA⋅dAdx ⟹ C′(x)=B′(A(x))⋅A′(x) \dfrac{dC}{dx} = \dfrac{dB}{dA} \cdot \dfrac{dA}{dx} \implies C'(x) = B'(A(x)) \cdot A'(x) dxdC=dAdB⋅dxdA⟹C′(x)=B′(A(x))⋅A′(x)
5. 复合运算(B∘AB \circ AB∘A)
C(x)=(B∘A)(x)=B(A(x))=∑i=0+∞bi(∑j=0+∞ajxj)i C(x) = (B \circ A)(x) = B(A(x)) = \sum_{i=0}^{+\infty} b_i \left( \sum_{j=0}^{+\infty} a_j x^j \right)^i C(x)=(B∘A)(x)=B(A(x))=i=0∑+∞bi(j=0∑+∞ajxj)i
卡特兰数封闭形式 (需要前置知识广义二项式)
卡特兰数封闭形式
递推式:Cn=∑i=0n−1CiCn−i−1C_n = \sum_{i=0}^{n-1} C_i C_{n-i-1}Cn=∑i=0n−1CiCn−i−1
设生成函数 F(x)=∑i=0+∞CixiF(x) = \sum_{i=0}^{+\infty} C_i x^iF(x)=∑i=0+∞Cixi ,满足:
F(x)=xF(x)2+1F(x) = xF(x)^2 + 1F(x)=xF(x)2+1
解方程:xF2−F+1=0⇒F=1±1−4x2xxF^2 - F + 1 = 0 \Rightarrow F = \frac{1 \pm \sqrt{1-4x}}{2x}xF2−F+1=0⇒F=2x1±1−4x
由 F(0)=C0=1F(0) = C_0 = 1F(0)=C0=1 ,取负号:F(x)=1−1−4x2xF(x) = \frac{1 - \sqrt{1-4x}}{2x}F(x)=2x1−1−4x
展开 1−4x=(1−4x)12=∑i=0+∞(12i)(−4x)i\sqrt{1-4x} = (1-4x)^{\frac{1}{2}} = \sum_{i=0}^{+\infty} \binom{\frac{1}{2}}{i}(-4x)^i1−4x=(1−4x)21=∑i=0+∞(i21)(−4x)i ,化简广义组合数: (手稿有详细证明)
(12i)=(−1)i−1(2i−2)!2ii!(i−1)!\binom{\frac{1}{2}}{i} = (-1)^{i-1}\frac{(2i-2)!}{2^i i! (i-1)!}(i21)=(−1)i−12ii!(i−1)!(2i−2)!
代入得:1−1−4x=∑i=1+∞(2i−2)!2ii!(i−1)!⋅xi1 - \sqrt{1-4x} = \sum_{i=1}^{+\infty} \frac{(2i-2)! 2^i}{i! (i-1)!} \cdot x^i1−1−4x=∑i=1+∞i!(i−1)!(2i−2)!2i⋅xi
除以 2x2x2x 后:
F(x)=∑i=0+∞(2i)!(i+1)!i!⋅xiF(x) = \sum_{i=0}^{+\infty} \frac{(2i)!}{(i+1)! i!} \cdot x^iF(x)=i=0∑+∞(i+1)!i!(2i)!⋅xi
故卡特兰数公式:Ci=(2i)!(i+1)!i!=1i+1(2ii)C_i = \frac{(2i)!}{(i+1)! i!} = \frac{1}{i+1}\binom{2i}{i}Ci=(i+1)!i!(2i)!=i+11(i2i)
常见幂级数展开式
ex=∑i=0+∞xii!e^x = \sum_{i=0}^{+\infty} \frac{x^i}{i!}ex=i=0∑+∞i!xi
(1+x)n=∑i=0+∞(ni)xi(1+x)^n = \sum_{i=0}^{+\infty} \binom{n}{i}x^i \quad (1+x)n=i=0∑+∞(in)xi
cosx=∑i=0+∞(−1)ix2i(2i)!\cos x = \sum_{i=0}^{+\infty} (-1)^i \frac{x^{2i}}{(2i)!}cosx=i=0∑+∞(−1)i(2i)!x2i
sinx=∑i=0+∞(−1)ix2i+1(2i+1)!\sin x = \sum_{i=0}^{+\infty} (-1)^i \frac{x^{2i+1}}{(2i+1)!}sinx=i=0∑+∞(−1)i(2i+1)!x2i+1
ln(1−x)=−∑i=1+∞xii\ln(1-x) = -\sum_{i=1}^{+\infty} \frac{x^i}{i}ln(1−x)=−i=1∑+∞ixi
11−x=∑i=0+∞xi\frac{1}{1-x} = \sum_{i=0}^{+\infty} x^i1−x1=i=0∑+∞xi
1(1−x)2=∑i=0+∞(i+1)xi\frac{1}{(1-x)^2} = \sum_{i=0}^{+\infty} (i+1)x^i(1−x)21=i=0∑+∞(i+1)xi
1(1−x)n=∑i=0+∞(i+n−1i)xi(高维前缀和形式)\frac{1}{(1-x)^n} = \sum_{i=0}^{+\infty} \binom{i+n-1}{i}x^i \quad \text{(高维前缀和形式)}(1−x)n1=i=0∑+∞(ii+n−1)xi(高维前缀和形式)
1(1+x)n=∑i=0+∞(i+n−1i)(−1)ixi(代入 -x )\frac{1}{(1+x)^n} = \sum_{i=0}^{+\infty} \binom{i+n-1}{i}(-1)^i x^i \quad \text{(代入 -x )}(1+x)n1=i=0∑+∞(ii+n−1)(−1)ixi(代入 -x )
11+xn=∑i=0+∞(−1)ixin\frac{1}{1+x^n} = \sum_{i=0}^{+\infty} (-1)^i x^{in}1+xn1=i=0∑+∞(−1)ixin
1(1+xj)m=∑i=0+∞(−1)i(i+m−1i)xij\frac{1}{(1+x^j)^m} = \sum_{i=0}^{+\infty} (-1)^i \binom{i+m-1}{i}x^{ij}(1+xj)m1=i=0∑+∞(−1)i(ii+m−1)xij
1(1−x)12=∑i=0+∞(2ii)4ixi\frac{1}{(1-x)^{\frac{1}{2}}} = \sum_{i=0}^{+\infty} \frac{\dbinom{2i}{i}}{4^i} x^i(1−x)211=i=0∑+∞4i(i2i)xi
单位根与多项式变换(FFT/NTT相关)(需要前置知识复数三角表示)
ωnk=cos(2kπn)+isin(2kπn)\omega_n^k = \cos\left(\frac{2k\pi}{n}\right) + i \sin\left(\frac{2k\pi}{n}\right)ωnk=cos(n2kπ)+isin(n2kπ)
ω2n2k=cos(2kπn)+isin(2kπn)=ωnk\omega_{2n}^{2k} = \cos\left(\frac{2k\pi}{n}\right) + i \sin\left(\frac{2k\pi}{n}\right) = \omega_n^{k}ω2n2k=cos(n2kπ)+isin(n2kπ)=ωnk
ωnk+n2=cos(2kπn+π)+sin(2kπn+π)=−ωnk\omega_n^{k+\frac{n}{2}} = \cos\left(\frac{2k\pi}{n} + \pi\right) + \sin\left(\frac{2k\pi}{n} + \pi\right) = -\omega_n^kωnk+2n=cos(n2kπ+π)+sin(n2kπ+π)=−ωnk
ωnn=1\omega_n^n = 1ωnn=1
A(x)=a0+a1x+a2x2+…+an−1xn−1A(x) = a_0 + a_1x + a_2x^2 + \ldots + a_{n-1}x^{n-1}A(x)=a0+a1x+a2x2+…+an−1xn−1
A(ωnk)=a0+a1ωnk+a2(ωnk)2+…+an−1(ωnk)n−1A(\omega_n^k) = a_0 + a_1\omega_n^k + a_2(\omega_n^k)^2 + \ldots + a_{n-1}(\omega_n^k)^{n-1}A(ωnk)=a0+a1ωnk+a2(ωnk)2+…+an−1(ωnk)n−1
=(a0+a2ωn2k+a4ωn4k+…)+ωnk(a1+a3ωn2k+a5(ωn2k)2+…)= \left(a_0 + a_2\omega_n^{2k} + a_4\omega_n^{4k} + \ldots\right) + \omega_n^k\left(a_1 + a_3\omega_n^{2k} + a_5(\omega_n^{2k})^2 + \ldots\right)=(a0+a2ωn2k+a4ωn4k+…)+ωnk(a1+a3ωn2k+a5(ωn2k)2+…)
=A1(ωn2k)+ωnkA2(ωn2k)= A_1(\omega_n^{2k}) + \omega_n^k A_2(\omega_n^{2k})=A1(ωn2k)+ωnkA2(ωn2k)
A(ωnk+n2)=A1(ωnk⋅ωnn2)+ωnk+n2A2(ωnk⋅ωnn2)=A1(ωn2k)−ωnkA2(ωn2k)A(\omega_n^{k+\frac{n}{2}}) = A_1\left(\omega_n^k \cdot \omega_n^{\frac{n}{2}}\right) + \omega_n^{k+\frac{n}{2}}A_2\left(\omega_n^k \cdot \omega_n^{\frac{n}{2}}\right) = A_1(\omega_n^{2k}) - \omega_n^k A_2(\omega_n^{2k})A(ωnk+2n)=A1(ωnk⋅ωn2n)+ωnk+2nA2(ωnk⋅ωn2n)=A1(ωn2k)−ωnkA2(ωn2k)
令 γk=A(ωnk)\gamma_k = A(\omega_n^k)γk=A(ωnk)
设 Ck=∑i=0n−1γiωn−ik=∑i=0n−1(∑j=0n−1ajωnji)ωn−ik=∑j=0n−1aj∑i=0n−1ωni(j−k)C_k = \sum_{i=0}^{n-1} \gamma_i \omega_n^{-ik} = \sum_{i=0}^{n-1} \left(\sum_{j=0}^{n-1} a_j \omega_n^{ji}\right) \omega_n^{-ik} = \sum_{j=0}^{n-1} a_j \sum_{i=0}^{n-1} \omega_n^{i(j-k)}Ck=∑i=0n−1γiωn−ik=∑i=0n−1(∑j=0n−1ajωnji)ωn−ik=∑j=0n−1aj∑i=0n−1ωni(j−k)
(ωnj−k−1)∑i=0n−1ωnix=ωnn(j−k)−1=0(\omega_n^{j-k} - 1)\sum_{i=0}^{n-1} \omega_n^{ix} = \omega_n^{n(j-k)} - 1 = 0(ωnj−k−1)i=0∑n−1ωnix=ωnn(j−k)−1=0
∑i=0n−1ωnix={0,ωnx≠1;n,ωnx=1\sum_{i=0}^{n-1} \omega_n^{ix} = \begin{cases} 0, & \omega_n^x \neq 1; \\ n, & \omega_n^x = 1 \end{cases}i=0∑n−1ωnix={0,n,ωnx=1;ωnx=1
∴Ck=nan−k\therefore C_k = n a_{n-k}∴Ck=nan−k ,故 ak=Cn−kna_k = \frac{C_{n-k}}{n}ak=nCn−k
(模板:Ck=∑γiωn−ikC_k = \sum \gamma_i \omega_n^{-ik}Ck=∑γiωn−ik ,故 ak=Ckna_k = \frac{C_k}{n}ak=nCk ,假设 ωn0=1\omega_n^0=1ωn0=1 ,结合 FFT )
设 ggg 为原根,ωn1=gp−1n\omega_n^{1} = g^{\frac{{p - 1}}{n}}ωn1=gnp−1 ,则 ω2n2k=ωnk\omega_{2n}^{2k} = \omega_n^{k}ω2n2k=ωnk ,ωnk+n2=−ωnk\omega_n^{k+\frac{n}{2}} = -\omega_n^kωnk+2n=−ωnk ,ωnn=gp−1=1\omega_n^n = g^{p - 1} = 1ωnn=gp−1=1 ,故可用 gp−1ng^{\frac{{p - 1}}{n}}gnp−1 代替单位根(即 NTT )。
另外,FFT可以通过提前预处理最低层的位置,将递归转为递推,从而减小常数。可以发现最终的位置就是初始位置的二进制反转。

该图经不知多少次搬运已不知出处
泰勒展开的理解
理解泰勒展开的一个角度
已知函数 G(x)G(x)G(x) ,求形式幂级数 F(x)F(x)F(x) 逼近 G(x)G(x)G(x) ,要求 ∀n,F(n)(x)=G(n)(x)\forall n, F^{(n)}(x) = G^{(n)}(x)∀n,F(n)(x)=G(n)(x)
设 F(x)=∑i=0+∞aixiF(x) = \sum_{i=0}^{+\infty} a_i x^iF(x)=∑i=0+∞aixi
代入 x=0x=0x=0 :F(n)(0)=n!an=G(n)(0)⇒an=G(n)(0)n!F^{(n)}(0) = n! a_n = G^{(n)}(0) \Rightarrow a_n = \frac{G^{(n)}(0)}{n!}F(n)(0)=n!an=G(n)(0)⇒an=n!G(n)(0) ,故
F(x)=∑i=0+∞G(i)(0)i!⋅xiF(x) = \sum_{i=0}^{+\infty} \frac{G^{(i)}(0)}{i!} \cdot x^iF(x)=i=0∑+∞i!G(i)(0)⋅xi
自变量偏移:令 F(x)=∑i=0+∞ai(x−x0)i=G(x)F(x) = \sum_{i=0}^{+\infty} a_i (x-x_0)^i = G(x)F(x)=∑i=0+∞ai(x−x0)i=G(x)
代入 x=x0x=x_0x=x0 :F(n)(x0)=n!an=G(n)(x0)⇒an=G(n)(x0)n!F^{(n)}(x_0) = n! a_n = G^{(n)}(x_0) \Rightarrow a_n = \frac{G^{(n)}(x_0)}{n!}F(n)(x0)=n!an=G(n)(x0)⇒an=n!G(n)(x0) ,故
F(x)=∑i=0+∞G(i)(x0)i!⋅(x−x0)iF(x) = \sum_{i=0}^{+\infty} \frac{G^{(i)}(x_0)}{i!} \cdot (x-x_0)^iF(x)=i=0∑+∞i!G(i)(x0)⋅(x−x0)i
牛顿迭代法
牛顿迭代法证明:
已知 G(x)G(x)G(x) ,要求 G(F(x))≡0(modxn)G(F(x)) \equiv 0 \pmod{x^n}G(F(x))≡0(modxn) ,求 F(x)F(x)F(x)
- 当 n=1n=1n=1 时等式可能不成立,需特殊处理。
- 对 GGG 泰勒展开:G(F(x))=∑i=0+∞G(i)(F0(x))i!⋅(F(x)−F0(x))iG(F(x)) = \sum_{i=0}^{+\infty} \frac{G^{(i)}(F_0(x))}{i!} \cdot (F(x)-F_0(x))^iG(F(x))=∑i=0+∞i!G(i)(F0(x))⋅(F(x)−F0(x))i
- 令 F0(x)≡0(modx⌈n2⌉)F_0(x) \equiv 0 \pmod{x^{\lceil \frac{n}{2} \rceil}}F0(x)≡0(modx⌈2n⌉) ,则 F(x)−F0(x)F(x)-F_0(x)F(x)−F0(x) 的最低非零次 ≥⌈n2⌉\geq \lceil \frac{n}{2} \rceil≥⌈2n⌉ ,故 i≥2i \geq 2i≥2 时,(F(x)−F0(x))i≡0(modxn)(F(x)-F_0(x))^i \equiv 0 \pmod{x^n}(F(x)−F0(x))i≡0(modxn)
- 简化得:G(F(x))≡G(F0(x))+G′(F0(x))(F(x)−F0(x))(modxn)G(F(x)) \equiv G(F_0(x)) + G'(F_0(x))(F(x)-F_0(x)) \pmod{x^n}G(F(x))≡G(F0(x))+G′(F0(x))(F(x)−F0(x))(modxn)
- 由 G(F(x))≡0(modxn)G(F(x)) \equiv 0 \pmod{x^n}G(F(x))≡0(modxn) ,得 F(x)≡F0(x)−G(F0(x))G′(F0(x))(modxn)F(x) \equiv F_0(x) - \frac{G(F_0(x))}{G'(F_0(x))} \pmod{x^n}F(x)≡F0(x)−G′(F0(x))G(F0(x))(modxn)
多项式求逆(G(x)F(x)≡1mod xnG(x)F(x) \equiv 1 \mod x^nG(x)F(x)≡1modxn) (复杂度证明不会qwq)
设 H(t)=G(x)−1tH(t) = G(x) - \frac{1}{t}H(t)=G(x)−t1 (这是关于变量 ttt 的函数,没有取模),令 H(F0(x))≡0(modx⌈n2⌉)H(F_0(x)) \equiv 0 \pmod{x^{\lceil \frac{n}{2} \rceil}}H(F0(x))≡0(modx⌈2n⌉)(F0F_0F0 是模 x⌈n2⌉x^{\lceil \frac{n}{2} \rceil}x⌈2n⌉ 的逆)。
由牛顿迭代:
F(x)≡F0(x)−H(F0(x))H′(F0(x))(modxn)F(x) \equiv F_0(x) - \frac{H(F_0(x))}{H'(F_0(x))} \pmod{x^n}F(x)≡F0(x)−H′(F0(x))H(F0(x))(modxn)
H(F0)=G−1F0H(F_0) = G - \frac{1}{F_0}H(F0)=G−F01 ,H′(F0)=1F02H'(F_0) = \frac{1}{F_0^2}H′(F0)=F021 ( GGG 不随 F0F_0F0 变化,求导可看作常数),代入得:
F(x)≡F0(x)−G−1F01F02≡2F0(x)−F0(x)2G(x)(modxn)F(x) \equiv F_0(x) - \frac{G - \frac{1}{F_0}}{\frac{1}{F_0^2}} \equiv 2F_0(x) - F_0(x)^2 G(x) \pmod{x^n}F(x)≡F0(x)−F021G−F01≡2F0(x)−F0(x)2G(x)(modxn)
多项式开方(F(x)2≡G(x)mod xnF(x)^2 \equiv G(x) \mod x^nF(x)2≡G(x)modxn)
设 H(t)=G(x)−t2H(t) = G(x) - t^2H(t)=G(x)−t2 ,则:
F(x)≡F0(x)−H(F0(x))H′(F0(x))(modxn)F(x) \equiv F_0(x) - \frac{H(F_0(x))}{H'(F_0(x))} \pmod{x^n}F(x)≡F0(x)−H′(F0(x))H(F0(x))(modxn)
H(F0)=G−F02H(F_0) = G - F_0^2H(F0)=G−F02 ,H′(F0)=−2F0H'(F_0) = -2F_0H′(F0)=−2F0 ,代入得:
F(x)≡F0(x)+G−F022F0≡F02+G2F0(modxn)F(x) \equiv F_0(x) + \frac{G - F_0^2}{2F_0} \equiv \frac{F_0^2 + G}{2F_0} \pmod{x^n}F(x)≡F0(x)+2F0G−F02≡2F0F02+G(modxn)
多项式 ln(要求 [x0]G(x)=1[x^0]G(x)=1[x0]G(x)=1)
一些有用的东西:
∫akxkdx=akk+1xk+1+C\int a_k x^k dx = \frac{a_k}{k+1}x^{k+1} + C∫akxkdx=k+1akxk+1+C
(f(g(x)))′=f′(g(x))g′(x)(f(g(x)))' = f'(g(x))g'(x)(f(g(x)))′=f′(g(x))g′(x)
(lnx)′=1x(\ln x)' = \frac{1}{x} (lnx)′=x1
已知 G(x)G(x)G(x) ,求 F(x)≡lnG(x)(modxn)F(x) \equiv \ln G(x) \pmod{x^n}F(x)≡lnG(x)(modxn):
- 导数关系:F′(x)≡G′(x)G(x)(modxn)F'(x) \equiv \frac{G'(x)}{G(x)} \pmod{x^n}F′(x)≡G(x)G′(x)(modxn)
- 积分求解:F(x)≡∫(G′(x)G(x))dx(modxn)F(x) \equiv \int \left(\frac{G'(x)}{G(x)}\right) dx \pmod{x^n}F(x)≡∫(G(x)G′(x))dx(modxn)
设 H(x)=G′(x)G(x)=∑i=0+∞aixiH(x) = \frac{G'(x)}{G(x)} = \sum_{i=0}^{+\infty} a_i x^iH(x)=G(x)G′(x)=∑i=0+∞aixi ,则积分后:
F(x)≡∑i=1+∞ai−1ixi(modxn)F(x) \equiv \sum_{i=1}^{+\infty} \frac{a_{i-1}}{i} x^i \pmod{x^n}F(x)≡i=1∑+∞iai−1xi(modxn)
多项式 exp
已知 G(x)G(x)G(x) ,求 F(x)≡eG(x)(modxn)F(x) \equiv e^{G(x)} \pmod{x^n}F(x)≡eG(x)(modxn):
- 对数关系:lnF(x)≡G(x)(modxn)\ln F(x) \equiv G(x) \pmod{x^n}lnF(x)≡G(x)(modxn)
- 牛顿迭代:设 H(t)=G(x)−lntH(t) = G(x) - \ln tH(t)=G(x)−lnt ,则
F(x)≡F0(x)−H(F0(x))H′(F0(x))(modxn)F(x) \equiv F_0(x) - \frac{H(F_0(x))}{H'(F_0(x))} \pmod{x^n}F(x)≡F0(x)−H′(F0(x))H(F0(x))(modxn)
H(F0)=G−lnF0H(F_0) = G - \ln F_0H(F0)=G−lnF0 ,H′(F0)=−1F0H'(F_0) = -\frac{1}{F_0}H′(F0)=−F01 ,代入得:
F(x)≡F0(x)(1+G(x)−lnF0(x))(modxn)F(x) \equiv F_0(x)\left(1 + G(x) - \ln F_0(x)\right) \pmod{x^n}F(x)≡F0(x)(1+G(x)−lnF0(x))(modxn)
多项式快速幂(G(x)kmod xnG(x)^k \mod x^nG(x)kmodxn)
- 指数恒等:G(x)k=eklnG(x)G(x)^k = e^{k \ln G(x)}G(x)k=eklnG(x) ,故 F(x)≡eklnG(x)(modxn)F(x) \equiv e^{k \ln G(x)} \pmod{x^n}F(x)≡eklnG(x)(modxn)(前提 G(0)=1G(0)=1G(0)=1 )。
- 推广:
- 若 G(0)≠1G(0) \neq 1G(0)=1 ,令 G(x)=a0⋅(G(x)a0)G(x) = a_0 \cdot \left(\frac{G(x)}{a_0}\right)G(x)=a0⋅(a0G(x)) ,则 G(x)k=a0k⋅(G(x)a0)kG(x)^k = a_0^k \cdot \left(\frac{G(x)}{a_0}\right)^kG(x)k=a0k⋅(a0G(x))k ,对 (G(x)a0)\left(\frac{G(x)}{a_0}\right)(a0G(x)) 用上述方法。
- 若 G(0)=0G(0)=0G(0)=0 ,找最小非零次 ttt ,令 G(x)=xt⋅H(x)G(x) = x^t \cdot H(x)G(x)=xt⋅H(x)(H(0)≠0H(0) \neq 0H(0)=0),则 G(x)k=xkt⋅H(x)kG(x)^k = x^{kt} \cdot H(x)^kG(x)k=xkt⋅H(x)k 。
代码实现(自己手写的,常数应该不算大)
const ll mod = 998244353, g0 = 3, invg0 = 332748118;
ll qpow(ll x, int k){
ll res = 1;
while(k){
if(k & 1)res = res * x % mod;
x = x * x % mod; k >>= 1;
}
return res;
}
void NTT(vector<ll>&a, int type){
int n = a.size();
int B = log2(n);
vector<int>r(n);
for(int i = 0; i < n; i++)
r[i] = (r[i >> 1] >> 1) | ((i & 1) << (B - 1));
for(int i = 0; i < n; i++)
if(i < r[i])swap(a[i], a[r[i]]);
for(int h = 2; h <= n; h <<= 1){
ll wn = qpow(type == 1 ? g0 : invg0, (mod - 1) / h);
for(int i = 0; i < n; i += h)
for(int j = i, w = 1; j < i + (h >> 1); j++, w = w * wn % mod){
ll u = a[j], v = w * a[j + (h >> 1)] % mod;
a[j] = (u + v) % mod; a[j + (h >> 1)] = (u - v + mod) % mod;
}
}
if(type == -1){
ll invn = qpow(n, mod - 2);
for(int i = 0; i < n; i++)
a[i] = a[i] * invn % mod;
}
}
vector<ll> poly_mult(vector<ll>a, vector<ll>b){
int n = 1;
while(n < a.size() + b.size())n <<= 1;
a.resize(n); b.resize(n);
NTT(a, 1); NTT(b, 1);
for(int i = 0; i < n; i++)
a[i] = a[i] * b[i] % mod;
NTT(a, -1); return a;
}
vector<ll> poly_inv(int n, vector<ll>&a){
vector<ll>b(1);
b[0] = qpow(a[0], mod - 2);
for(int m = 1; m < n; m <<= 1){
int L = m << 1;
vector<ll>t = poly_mult(b, b);
vector<ll>ta(a.begin(), a.begin() + min(L, (int)a.size()));//取min是保证复杂度的关键!
t = poly_mult(t, ta);
b.resize(L);
for(int i = 0; i < L; i++)
b[i] = (2 * b[i] - t[i] + mod) % mod;
}
b.resize(n); return b;
}
vector<ll> poly_sqrt(int n, vector<ll>&a){
vector<ll>b(1); b[0] = 1;
for(int m = 1; m < n; m <<= 1){
int L = m << 1;
vector<ll>t = poly_mult(b, b);
t.resize(L);
for(int i = 0; i < L; i++)
t[i] = (t[i] + a[i]) % mod;
vector<ll>inv(L);
for(int i = 0; i < L; i++)
inv[i] = b[i] * 2 % mod;
inv = poly_inv(L, inv);
b = poly_mult(t, inv);
}
b.resize(n); return b;
}
vector<ll> poly_differential(int n, vector<ll>&a){
vector<ll>b(n);
for(int i = 1; i < min(n, (int)a.size()); i++)
b[i - 1] = a[i] * i % mod;
if((int)a.size() > n)b[n - 1] = a[n] * n % mod;
return b;
}
vector<ll> poly_integral(int n, vector<ll>&a){
vector<ll>b(n);
for(int i = 1; i < min(n, (int)a.size() + 1); i++)
b[i] = a[i - 1] * qpow(i, mod - 2) % mod;
return b;
}
vector<ll> poly_ln(int n, vector<ll>&a){//a[0]必须为1
vector<ll>b = poly_differential(n, a), inv = poly_inv(n, a);
b = poly_mult(b, inv);
b = poly_integral(n, b);
return b;
}
vector<ll> poly_exp(int n, vector<ll>&a){
vector<ll>b(1); b[0] = 1;
for(int m = 1; m < n; m <<= 1){
int L = m << 1;
vector<ll>ta(a.begin(), a.begin() + min((int)a.size(), L));
vector<ll>t = poly_ln(L, b); ta[0]++;
for(int i = 0; i < L; i++)
t[i] = (ta[i] - t[i] + mod) % mod;
b = poly_mult(b, t);
b.resize(L);
}
b.resize(n); return b;
}
vector<ll> poly_pow(int n, vector<ll>&a, vector<ll>&k){//要求a[0] = 1
ll K = 0, bit = 1;
for(int i = k.size() - 1; i >= 0; i--)
K = (k[i] * bit + K) % mod, bit = bit * 10 % mod;
vector<ll>b = poly_ln(n, a);
for(auto &t : b)t = (t * K) % mod;
b = poly_exp(n, b);
return b;
}






1759

被折叠的 条评论
为什么被折叠?



