多项式全家桶

【多项式求逆】

【整式取模】

定义单项式取模。

\[C\cdot x^k\bmod x^n=\begin{cases}0&k\ge n\\C\cdot x^k&k<n\end{cases} \]

定义多项式取模为它的每一项取模相加。

可以看出,模 \(x^n\) 相当于保留 \(0\sim n-1\) 次项。

【问题描述】

一般形式:已知多项式 \(A(x),C(x)\),求 \(B(x)\) 使 \(A(x)B(x)=C(x)\pmod {x^n}\)

特殊形式:已知多项式 \(A(x)\),求 \(D(x)\) 使 \(A(x)D(x)=1\pmod {x^n}\)

我们只需要解特殊形式,因为解出特殊形式的 \(D(x)\) 后,可以令 \(B(x)=D(x)C(x)\),一次卷积 \(O(n\log n)\) 即可。

【解法 - \(O(n^2)\)

已知 \(A(x)\),求 \(B(x)\) 使 \(A(x)B(x)=1\pmod {x^n}\)

\(A,B\) 的系数为 \(A_0\sim A_{n-1},B_0\sim B_{n-1}\)

首先要保证 \(A_0\neq 0\),否则 \(A(x)\) 不可逆;然后可得 \(A_0B_0=1\),可以解 \(B_0\)

然后 \(A_1B_0+A_0B_1=0\),可以解出 \(B_1\) …… 如此循环,可以 \(O(n^2)\) 求解。

【解法 - \(O(n\log n)\)

注意到如果 \(A(x)B(x)=1\pmod {x^n}\),则 \(A(x)B(x)=1\pmod {x^{n-1}}\)。所以我们可以增大 \(n\),这样的解也是符合要求的解。

\(n=2^k\),方便我们用倍增的方法优化。
假设已知 \(B(x)\) 满足 \(A(x)B(x)=1\pmod {x^m}\),怎么求得 \(B_2(x)\) 满足 \(A(x)B_2(x)=1\pmod {x^{2m}}\)

\[\begin{aligned} AB-1&=0\pmod {x^m}\\ (AB-1)^2&=0\pmod {x^{2m}}\\ A^2B^2-2AB+1&=0\pmod {x^{2m}}\\ 2AB-A^2B^2&=1\pmod {x^{2m}}\\ A(2B-AB^2)&=1\pmod {x^{2m}}\\ \end{aligned} \]

因此 \(B_2(x)=2B(x)-A(x)B(x)^2\)。从 \(A(x),B(x)\)\(B_2(x)\),只需要做两次多项式乘法和一次多项式减法,复杂度 \(O(n\log n)\)
但是倍增也有一个 \(\log\) 啊?怎么是 \(O(n\log n)\) 呢?

因为对于一个 \(m\),我们只保留多项式前 \(m\) 项即可,不用保留 \(n\) 项。因此复杂度应该是 \(O(n\log n+\frac{n}{2}\log n+\frac{n}{4}\log n+\cdots)=O(n\log n)\)

可以把求逆看作除法。

【多项式开方】

【多项式带余除法】

给定 \(A(x),B(x)\),找 \(C(x),R(x)\) 使得 \(A(x)=B(x)C(x)+R(x)\),要求 \(\deg R(x)<\deg B(x)\)
不妨 \(\deg A\ge\deg B\),不然直接令 \(C(x)=0,R(x)=A(x)\)。记 \(n=\deg A,m=\deg B\)
为了下面方便,把 \(R(x)\) 最高次不断补 \(0\),直到 \(\deg R=m-1\)

定义一个操作 \(R\)\(A^R(x)=x^nA(\dfrac{1}{x})\)
\(A^R\) 的作用其实就是把 \(A\) 的系数翻转(Reverse)了。可以手算一下。

\[\begin{aligned} A(x)&=B(x)C(x)+R(x)\\ A(\dfrac{1}{x})&=B(\dfrac{1}{x})C(\dfrac{1}{x})+R(\dfrac{1}{x})\\ x^nA(\dfrac{1}{x})&=x^nB(\dfrac{1}{x})C(\dfrac{1}{x})+x^nR(\dfrac{1}{x})\\ x^nA(\dfrac{1}{x})&=x^mB(\dfrac{1}{x})\cdot x^{n-m}C(\dfrac{1}{x})+x^{m-1}R(\dfrac{1}{x})\cdot x^{n-m+1}\\ A^R(x)&=B^R(x)C^R(x)+R^R(x)\cdot x^{n-m+1}\\ &\text{注意这里的 Reverse(R) 是从 m-1 次项开始翻转,是补足之后的}\\ A^R(x)&=B^R(x)C^R(x)\pmod {x^{n-m+1}}\\ \end{aligned} \]

用多项式求逆解 \(C^R(x)\)。为什么这里的 \(B^R(x)\) 是一定有逆的?因为 \(B(x)\) 的最高次项的系数一定不是 \(0\),否则 \(\deg B\neq m\) 矛盾。因此 \(B^R(x)\) 的常数项非 \(0\)。求逆复杂度 \(O(n\log n)\)

因为 \(C^R(x)\) 就是 \(C(x)\) 的系数翻转。所以 \(O(n)\) 可得 \(C(x)\)。而 \(R(x)=A(x)-B(x)C(x)\),一次卷积即可,复杂度 \(O(n\log n)\)

总复杂度 \(O(n\log n)\)

【例题】

  • HDU5730

\(1\times i\) 的骨牌种类数为 \(a_i\)。要用若干骨牌覆盖 \(1\times n\)。问方案数。\(a_i,n\le 10^5\)

法一:令 \(A(x)=\sum_{i\ge 1}a_ix^i\)。用 \(k\) 个骨牌覆盖的方案数为 \([x^n]A^k(x)\)\(ans=\sum_{k\ge 0}[x^n]A^k(x)=[x^n]\sum_{k\ge 0}A^k(x)=[x^n]\dfrac{1}{1-A(x)}\)
\(O(n)\) 算出来 \(A(x)\),然后 \(O(1)\)\(1-A(x)\),然后 \(O(n\log n)\)\(1-A(x)\bmod {x^{n+1}}\) 的逆。

法二:考虑 DP。
\(f_n=\sum_{i=0}^n f_{n-i}a_i\)。是卷积的形式。可以推出 \(F=F\times A+1\)。这个 \(+1\) 是因为 \(n=0\)\(a_0=0\),但是 \(f_0=1\)
\(F=\dfrac{1}{1-A}\),求逆。

  • P4841 城市规划

\(n\) 个点有标号连通图个数。\(n\le 2e5\)

法一:EGF。
\(P(x)\) 为 "\(n\) 个点有标号图个数" 的 EGF,\(Q(x)\) 为 "\(n\) 个点有标号连通图个数" 的 EGF。有 \(P(x)=\exp Q(x)\),则 \(Q(x)=\ln P(x)\)。虽然 \(\ln\) 还不知道,但是 \(O(n\log n)\) 可解。

法二:基于求逆。
\(p_n=2^{n\choose 2}\)\(n\) 个点有标号图数量,\(f_n\) 为答案。枚举 \(1\) 所在连通块的大小 \(k\)
\(p_n=\sum_{k=1}^n{{n-1}\choose {k-1}}f_kp_{n-k}\),套路把二项式系数拆开放。\(\dfrac{p_n}{(n-1)!}=\sum_{k=1}^n\dfrac{f_k}{(k-1)!}\cdot\dfrac{p_{n-k}}{(n-k)!}\)

已经是类似卷积的形式。考虑三个多项式 \(P_1(x)=\sum_{n\ge 1}\dfrac{p_n}{(n-1)!}x^n\)\(F(x)=\sum_{k\ge 1}\dfrac{f_k}{(k-1)!}x^k,P_2(x)=\sum_{n\ge 0}\dfrac{p_n}{n!}x^n\)。可以观察到 \(P_1(x)=F(x)P_2(x)\),因为 \(p_n\) 是已知的,所以 \(P_1(x),P_2(x)\) 已知。一次求逆即可求出 \(F(x)\)。因为我们要求 \(x^n\) 的系数,模数取 \(x^{n+1}\) 即可。

【多项式 \(\ln\)\(\exp\)

重要公式: \(\ln(1-x)=-\displaystyle\sum_{i=1}^{\infty}\dfrac{1}{i}x^i\)

证明:当 \(x=0\) 时相等。而两侧导数相等。所以相等。注意这里有个负号

可以看出,当 \(A(x)\) 的常数项为 \(1\)\(\ln(A(x))\) 不含常数项。
(求 \(\ln(A(x))\),令 \(A(x)=1-B(x)\)\(\ln(1-B(x))\) 可求)

重要公式\(\exp(A(x))=\sum_{i\ge 0}\dfrac{A^i(x)}{i!}\)。即泰勒展开式。

\(\ln\)

给定多项式 \(A(x)\),保证常数项 \(=1\),求 \(G(x)=\ln(A(x))\bmod {x^n}\)

因为 \(A_0=1\),所以 \(G_0=0\)
\(G(x)=\ln(A(x)),G'(x)=\dfrac{A'(x)}{A(x)}\)(导数)。

大体思路是求 \(G'(x)\% x^{n-1}\),然后已知导数可以还原出 \(G(x)\)\(x^1\sim x^n\) 项系数。而 \(G_0=0\) 是已知的。

于是我们目标求 \(\dfrac{A'(x)}{A(x)}\bmod x^{n-1}\)。而 \(A(x)\) 已知,进而 \(A'(x)\) 已知。所以 \(\dfrac{A'(x)}{A(x)}\bmod x^{n-1}\) 可以用求逆 \(O(n\log n)\) 求得。


如果首项不是 \(1\) 怎么办?首先 \(\ln(0)\) 是没有定义的,其次可以提取公因式使首项为 \(1\)

\(\ln(A(x)B(x))=\ln(A(x))+\ln(B(x))\)

\(\exp\)

\(\exp(A(x))=e^{A(x)}=\sum_{i\ge 0}\dfrac{A(x)^i}{i!}\)

给定常数项为 \(0\)\(n-1\) 次多项式 \(A(x)\),求 \(\exp(A(x))\)。(如果常数项非 \(0\),可以把常数项单独拆出来。例如 \(e^{4+x}=e^4\cdot e^x\)

\(B(x)=e^{A(x)}\)\(f_0(x)=B(x)\pmod {x^n}\)。还是倍增的思路,考虑如何求出 \(f_1(x)=B(x)\pmod {x^{2n}}\)

这里用到泰勒展开。即 \(g(x)=g(x_0)+g'(x_0)\cdot(x-x_0)+\dfrac{1}{2!}g''(x_0)(x-x_0)^2+\cdots\)

\(x\leftarrow B(x),x_0\leftarrow f_0(x)\),再模 \(x^{2n}\)。因为 \((B(x)-f_0(x))^2\) 及以后模 \(x^{2n}\) 都变成 \(0\) 了。所以 \(g(B(x))=g(f_0(x))+g'(f_0(x))\cdot (B(x)-f_0(x))\)

然后我们令 \(g(x)=\ln x\),得到 $$\ln B(x)=A(x)=\ln f_0(x)+\dfrac{1}{f_0(x)}(B(x)-f_0(x))\pmod {x^{2n}}$$

可推出:

\[B(x)=f_0(x)(A(x)-\ln f_0(x)+1)\pmod {x^{2n}} \]

因此 \(f_1(x)=f_0(x)(A(x)-\ln f_0(x)+1)\)。不断倍增直到模数足够。
然后 \(B(x)=f(x)(A(x)-\ln f(x)+1)\pmod {x^{2n}}\),可求出 \(B(x)\)

细节:记 \(N\) 为将 \(n\) 扩充为 \(2\) 的幂后的 \(n\)\(f_0(x)\)\(N\) 次,\(A(x)-\ln f_0(x)+1\)\(N\) 次,则 \(f_1(x)\)\(2N\) 次。为了确定 \(2N\) 次多项式的系数,需要 \(2N\) 个点值,而 \(N\le 2n\),所以需要 \(4n\) 个点值,所以 FFT 设置单位根要用 \(\varepsilon_{4n}\)

【例题】

  • P4389 付公主的背包

\(\prod_{i=1}^n(\dfrac{1}{1-x^i})^{a_i}\pmod {x^{N+1}}\)
注意 \(n\) 是物品个数,\(N\) 是目标容积。

要把次方拿下来,可以用 \(\ln + \exp\)

\[\begin{aligned} &=\exp(\ln(\prod_{i=1}^n(\dfrac{1}{1-x^i})^{a_i}))\\ &=\exp(\ln(\prod_{i=1}^n(1-x^i)^{-a_i}))\\ &=\exp(\sum_{i=1}^n-a_i\ln (1-x^i))\\ &=\exp(-\sum_{i=1}^na_i(-\sum_{j\ge 1}\dfrac{x^{ij}}{j}))\\ &=\exp(\sum_{i=1}^na_i\sum_{j=1}^{[\frac{N}{i}]}\dfrac{x^{ij}}{j})\pmod {x^{N+1}} \end{aligned} \]

复杂度?\(\exp\) 内部是调和级数的 \(O(n\log n)\)\(\exp\) 也是 \(O(n\log n)\) 的。

  • 有限制的置换计数

给定一个集合 \(S\),问有多少个 \(n\) 阶置换,每个轮换大小都属于集合 \(S\)

可以看作图计数(若干个环)。这个和城市规划相反,连通的很好计数,不连通的反而不好算。
用 EGF 即可。

【多项式快速幂】

给定 \(f(x)\)。求 \(f^k(x)\bmod x^n\)

如果快速幂,复杂度 \(O(n\log k\log n)\),但可以优化到 \(O(n\log n)\)

要把次方拿下来,可以 \(\ln + \exp\)

假设 \(f(x)\) 常数项为 \(1\)\(f^k(x)=\exp(\ln f^k(x))=\exp(k\ln f(x))\)\(\ln f(x)\) 因为常数项 \(1\) 很好求。

如果 \(f(x)=ax^d(1+?x^?+?x^?+\cdots)=ax^d\cdot g(x)\),则 \(f^k(x)=a^Kx^{kd}g^k(x)\)\(g^k(x)\) 用上面的方法求。

【多项式多点点值】

\(f(x)\) 已知,求 \(f\)\(x_0\sim x_{n-1}\) 的值。\(O(n\log^2 n)\)

\(P_{l,r}(x)=\displaystyle\prod_{i=l}^r(x-x_i)\)\(f_{l,r}(x)=f(x)\% P_{l,r}(x)\)

(多项式模多项式就是带余除法)

\(f_{i,i}(x)=f(x)\% (x-x_i)\Rightarrow f(x)=(x-x_i)Q(x)+f_{i,i}(x)\)

\(\therefore f(x_i)=f_{i,i}(x)\)

总思路是分治,先求 \(f_{1,n}\),再求 \(f_{1,n/2},f_{n/2+1,n}\) ……

关键:已知 \(f_{l,r}(x)\),求 \(f_{l,m}(x)\)\(f_{m+1,r}(x)\)。这两者是对称的,只研究怎么求前者。

\[f_{l,r}(x)=f(x)\% p_{l,r}(x) \]

\[f_{l,m}(x)=f(x)\% p_{l,m}(x) \]

注意到 \(p_{l,m}(x)\)\(p_{l,r}(x)\) 的因式,所以 \(f(x)\% p_{l,m}(x)=(f(x)\% p_{l,r}(x))\% p_{l,m}(x)=f_{l,r}(x)\% p_{l,m}(x)\)

如果 \(p_{l,m}(x)\) 已知,可以 \(O(n\log n)\) 取模求出。每层复杂度 \(O(n\log n)\),共 \(O(n\log^2 n)\)

如何预处理 \(P_{l,m}(x)\)?分治树从底向上。

【多项式多点插值】

还是拉格朗日插值法。先把不优化的 \(O(n^2)\) 版本放出来。

可以优化到 \(O(n\log^2 n)\)

先求分母。定义 \(M(x)=\prod_{i=0}^{n-1}(x-x_i)\)。则 \(F(x)\)\(i\) 项分母为 \(\dfrac{M(x)}{x-x_i}\)\(x=x_i\) 的值。

\(M(x),x-x_i\)\(x=x_i\) 时都为 \(0\)。使用洛必达法则\(\dfrac{M(x)}{x-x_i}=\dfrac{M'(x)}{1}=M'(x)\),即求 \(M'(x)\)\(x=x_i\) 的值。

于是先求 \(M(x)\),可以 \(O(n\log^2 n)\) 分治求;然后 \(O(n)\)\(M'(x)\);最后用上面的点值求出 \(M'(x)\)\(x_0\sim x_{n-1}\) 的值,即可得到 \(i=0\sim n-1\) 的分母。

求出分母后,令 \(V_i\) 为第 \(i\) 个的分母乘以 \(y_i\)\(F(x)=\displaystyle\sum_{i=0}^{n-1}V_i\prod_{j\neq i}(x-x_j)\)。这里 \(V_i\) 是已经 \(O(n\log^2 n)\) 求出来的了。

这个式子直接循环还是至少平方级别。需要简化。

\[F(x)=\sum_{i=0}^{n-1}V_i\prod_{j=0}^{n-1}(x-x_j)\cdot [j\neq i] \]

定义一个 \(L(x)=\displaystyle\sum_{j=0}^{n/2-1}(x-x_j),R(x)=\sum_{j=n/2}^{n-1}(x-x_j)\)

\[F(x)=[\sum_{i=0}^{n/2-1}V_i(\prod_{j=0}^{n/2-1}(x-x_j)\cdot [j\neq i])\cdot R(x)]+[\sum_{i=n/2}^{n-1}V_i(\prod_{j=n/2}^{n-1}(x-x_j)\cdot [j\neq i])\cdot L(x)] \]

(因为当 \(i=0\sim n/2-1\)\(j=n/2\sim n-1\)\([j\neq i]\) 肯定是 \(1\)

\[F(x)=R(x)\sum_{i=0}^{n/2-1}V_i\prod_{j=0}^{n/2-1}(x-x_j)[j\neq i]+L(x)\sum_{i=n/2}^{n-1}V_i\prod_{j=n/2}^{n-1}(x-x_j)[j\neq i] \]

这拆出来的两项和 \(F(x)\) 原本的形式一样,只是规模减半了。所以可以分治下去。合并的时候 \(R(x)\)\(L(x)\) 做乘法再相加即可。合并复杂度 \(O(n\log n)\),总复杂度 \(O(n\log^2 n)\)

对于 \(L(x),R(x)\) 也要预处理,和点值的 \(p_{l,r}(x)\) 处理方法一样。

【例题】

  • UOJ182 "\(a^{-1}+b\)"

给定 \(x_1\sim x_n\)\(n\le 1e5\)\(m\le 6e4\) 个操作。每个操作要么全体加 \(C\),要么全体求逆。这里一切运算均在模 \(998244353\) 意义下进行。每次操作后输出所有 \(x_i\) 之和。

结论:在第 \(i\) 轮操作后,所有 \(x_j\) 形式都是 \(\dfrac{a_ix_j+b_i}{c_ix_j+d_i}\)

即求 \(\displaystyle\sum_{j=1}^n\dfrac{a_ix_j+b_i}{c_ix_j+d_i}\)

分子的次数等于分母,可以做分离常数,\(=\sum\dfrac{e_i}{c_ix_j+d_i}+c'_i\)。如果 \(c_i=0\),可以立刻求出来;否则上下同时除以 \(c_i\)\(=\sum\dfrac{u_i}{x_j+t_i}+c'_i\)。然后可以把 \(u_i\) 统一提到求和符号外面去,\(=u_i\sum\dfrac{1}{x_j+t_i}+c'_i\)

上面所有只和 \(i\) 相关的都能求出来,然后怎么做?

定义 \(f(t)=\sum_{i} \dfrac{1}{x_i+t}\)。预先把 \(m\) 次操作后的 \(t_i\) 都算出来,我们要求 \(f(t)\)\(t_1\sim t_m\) 的值。

但是 \(f(t)\) 不是多项式。直接通分,分母 \(Q(t)=(t+x_1)\cdots(t+x_n)\)。观察到分子 \(P(t)\) 恰好是 \(Q(t)\) 的导数(链式法则)。

\(Q(t)\) 可以 \(O(n\log^2 n)\) 求,\(Q'(t)\) 可以从 \(Q(t)\) 求。对 \(Q(t),Q'(t)\) 多点求值即可。

posted @ 2024-04-20 09:06  FLY_lai  阅读(19)  评论(0编辑  收藏  举报