多项式和生成函数学习笔记

(注:以下为形式幂级数的代数运算,不严格要求收敛性,仅作形式化推导。内容大部分由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)iN, 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 (AB)(x)=i=0+(j=0iajbij)xi
满足 交换律结合律对加法的分配律

(A∗B)(x)≡1(modxn)(A * B)(x) \equiv 1 \pmod{x^n}(AB)(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(k1)(x))

  • 求导法则:
    (A+B)′=A′+B′,(AB)′=A′B+AB′ (A + B)' = A' + B', \quad (AB)' = A'B + AB' (A+B)=A+B,(AB)=AB+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=dAdBdxdAC(x)=B(A(x))A(x)

5. 复合运算(B∘AB \circ ABA

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)=(BA)(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=0n1CiCni1
设生成函数 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}xF2F+1=0F=2x1±14x
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)=2x114x

展开 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)^i14x=(14x)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)i12ii!(i1)!(2i2)!

代入得: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^i114x=i=1+i!(i1)!(2i2)!2ixi
除以 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
cos⁡x=∑i=0+∞(−1)ix2i(2i)!\cos x = \sum_{i=0}^{+\infty} (-1)^i \frac{x^{2i}}{(2i)!}cosx=i=0+(1)i(2i)!x2i
sin⁡x=∑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(1x)=i=1+ixi
11−x=∑i=0+∞xi\frac{1}{1-x} = \sum_{i=0}^{+\infty} x^i1x1=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(1x)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{(高维前缀和形式)}(1x)n1=i=0+(ii+n1)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+n1)(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+m1)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(1x)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(n2)+isin(n2)
ω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(n2)+isin(n2)=ω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(n2+π)+sin(n2+π)=ω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++an1xn1
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++an1(ωnk)n1
=(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=0n1γiωnik=i=0n1(j=0n1ajωnji)ωnik=j=0n1aji=0n1ωni(jk)

(ω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(ωnjk1)i=0n1ωnix=ωnn(jk)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=0n1ωnix={0,n,ωnx=1;ωnx=1

∴Ck=nan−k\therefore C_k = n a_{n-k}Ck=nank ,故 ak=Cn−kna_k = \frac{C_{n-k}}{n}ak=nCnk

(模板:Ck=∑γiωn−ikC_k = \sum \gamma_i \omega_n^{-ik}Ck=γiωnik ,故 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=gnp1 ,则 ω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=gp1=1 ,故可用 gp−1ng^{\frac{{p - 1}}{n}}gnp1 代替单位根(即 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=0F(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(xx0)i=G(x)
代入 x=x0x=x_0x=x0F(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)(xx0)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(modx2n) ,则 F(x)−F0(x)F(x)-F_0(x)F(x)F0(x) 的最低非零次 ≥⌈n2⌉\geq \lceil \frac{n}{2} \rceil2n ,故 i≥2i \geq 2i2 时,(F(x)−F0(x))i≡0(modxn)(F(x)-F_0(x))^i \equiv 0 \pmod{x^n}(F(x)F0(x))i0(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(modx2n)F0F_0F0 是模 x⌈n2⌉x^{\lceil \frac{n}{2} \rceil}x2n 的逆)。
由牛顿迭代:
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)=GF01H′(F0)=1F02H'(F_0) = \frac{1}{F_0^2}H(F0)=F021GGG 不随 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)F021GF012F0(x)F0(x)2G(x)(modxn)

多项式开方(F(x)2≡G(x)mod  xnF(x)^2 \equiv G(x) \mod x^nF(x)2G(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)=GF02H′(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)+2F0GF022F0F02+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} + Cakxkdx=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)
(ln⁡x)′=1x(\ln x)' = \frac{1}{x} (lnx)=x1

已知 G(x)G(x)G(x) ,求 F(x)≡ln⁡G(x)(modxn)F(x) \equiv \ln G(x) \pmod{x^n}F(x)lnG(x)(modxn)

  1. 导数关系: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)
  2. 积分求解: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+iai1xi(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)

  1. 对数关系:ln⁡F(x)≡G(x)(modxn)\ln F(x) \equiv G(x) \pmod{x^n}lnF(x)G(x)(modxn)
  2. 牛顿迭代:设 H(t)=G(x)−ln⁡tH(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−ln⁡F0H(F_0) = G - \ln F_0H(F0)=GlnF0H′(F0)=−1F0H'(F_0) = -\frac{1}{F_0}H(F0)=F01 ,代入得:
    F(x)≡F0(x)(1+G(x)−ln⁡F0(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

  1. 指数恒等:G(x)k=ekln⁡G(x)G(x)^k = e^{k \ln G(x)}G(x)k=eklnG(x) ,故 F(x)≡ekln⁡G(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 )。
  2. 推广:
    • 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)=xtH(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=xktH(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;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值