多项式全家桶
【多项式求逆】
【整式取模】
定义单项式取模。
定义多项式取模为它的每一项取模相加。
可以看出,模 \(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}}\)?
因此 \(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)了。可以手算一下。
用多项式求逆解 \(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}}$$
可推出:
因此 \(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\)。
复杂度?\(\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)\)。这两者是对称的,只研究怎么求前者。
注意到 \(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)\) 求出来的了。
这个式子直接循环还是至少平方级别。需要简化。
定义一个 \(L(x)=\displaystyle\sum_{j=0}^{n/2-1}(x-x_j),R(x)=\sum_{j=n/2}^{n-1}(x-x_j)\)。
(因为当 \(i=0\sim n/2-1\),\(j=n/2\sim n-1\),\([j\neq i]\) 肯定是 \(1\))
这拆出来的两项和 \(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)\) 多点求值即可。