关于多项式的做题记录及整理

最近被多项式制裁了,故开此贴记录一些做过的多项式题及多项式trick。

FFT、NTT、基本求导技巧

HDU 多校 Day3 1004

Problem

\((a_{2}x^{2}+a_{1}x+a_{0})^t\)\(t\le 10^7\)。系数对 \(998244353\) 取模。

Solution

\(F(x)=a_{2}x^{2}+a_{1}x+a_{0}\)\(G(x)=F^t(x)\),那么对 \(G(x)\) 求导得

\[G'(x)=tF'(x)F^{t-1}(x) \]

\[G'(x)F(x)=tF'(x)G(x)\\ \]

利用 \([x^i]F'(x)=(i+1)[x^{i+1}]F(x)\),可以得到 \([x^i]G(x)\)\([x^{i-1}]G(x),[x^{i-2}]G(x)\) 的关系式。

故可 \(O(t)\) 求解。

付公主的背包

Problem

\(\prod\limits_{i=1}^{n}(x^{a_i}+1) \bmod x^{m+1}\),其中 \(n,m,a_i\le 10^5\)。答案对 \(998244353\) 取模。

Solution

该多项式次数为 \(\sum a_i\),过大,故无法直接 NTT。

考虑将上式取对,得:

\[\sum\limits_{i=1}^{n}\ln{(1+x^{a_i})} \]

\(\ln{(1+x)}\) 的麦克劳林展开 \(\ln{(1+x)}=\sum\limits_{n=1}^{\infty}{(-1)^{n-1}\frac{x^n}{n}}\) 可得:

\[\sum\limits_{i=1}^{n}{\sum\limits_{j=1}^{\infty}{(-1)^{j-1}x^{ja_i}}} \]

再考虑对上式 \(\exp\)。记 \(g(x)=\exp{f(x)}\),求导可得:

\[g'(x)=f'(x)\exp{f(x)} \]

\[g'(x)=f'(x)g(x) \]

\[(n+1)[x^{n+1}]g(x)=\sum\limits_{i=0}^{n}{(i+1)[x^{i+1}]f(x)\cdot[x^{n-i}]g(x)} \]

上述式子使用 CDQ 分治处理即可,时间复杂度 \(O(n\log^2{n})\)

多项式牛顿迭代、多项式初等函数

多项式牛顿迭代用于求解自变量为多项式的函数的零点。

所谓自变量为多项式的函数,即将多项式看作函数自变量,例如 \(g(f(x))\),即为将 \(f(x)\) 看作函数 \(g\) 的自变量。

考虑求解自变量为多项式的函数 \(g(f(x))\) 在模 \(x^n\) 意义下的零点,即求解方程 \(g(f(x))\equiv 0\pmod{x^n}\)

不妨假设我们已经求出该函数在模 \(x^{\lceil \frac{n}{2}\rceil}\) 意义下的零点 \(f_0(x)\),显然 \(f_0(x)\equiv f(x)\pmod{x^{\lceil \frac{n}{2}\rceil}}\)

考虑对函数 \(g(f(x))\)\(f(x)=f_0(x)\) 处泰勒展开,得到:

\[g(f(x))=\sum\limits_{i=0}^{\infty}{\frac{g^{(i)}(f_0(x))}{i!}(f(x)-f_0(x))^i} \]

由于 \(f(x)-f_0(x)\) 的最低次数大于 \(\lceil \frac{n}{2}\rceil\),故当 \(i\le 2\) 时,有 \((f(x)-f_0(x))^i\equiv 0\pmod{x^n}\)

我们将 \(g(f(x))\) 的泰勒展开带回原方程并化简得到:

\[g(f_0(x))+g'(f_0(x))(f(x)-f_0(x))\equiv 0\pmod{x^n} \]

移项可得:

\[f(x)\equiv f_0(x)-\frac{g(f_0(x))}{g'(f_0(x))}\pmod{x^n} \]

\(\frac{g(f_0(x))}{g'(f_0(x))}\) 的求解根据具体函数选择方法。

\([x^0]f(x)\) 需根据 \(g(f(x))\equiv 0\pmod{x}\) 另行求解。

多项式牛顿迭代的使用可以类比高中数学的构造函数求零点,我们不妨设 \(h(x)\) 为给定多项式,\(f(x)\) 为目标多项式,他们之间的关系为 \(h(x)=p(f(x))\),其中 \(p(f(x))\) 为自变量为 \(f(x)\) 的函数。

用高中数学的套路进行类比,我们可以将 \(f(x)\) 看作自变量,\(h(x)\) 看作常数,我们要解这样子的一个方程 \(p(f(x))=h(x)\),那么我们可以设函数 \(g(f(x))=p(f(x))-h(x)\),我们要做的就是求解函数 \(g(f(x))\)\(\bmod{x^n}\) 意义下的零点。

接下来的事情就是使用多项式牛顿迭代了。

多项式乘法逆

Problem

已知 \(A(x) * B(x)\equiv 1\pmod{x^n}\),求 \(B(x)\),其中 \(A(x)=\sum_{i=0}^{n-1}a_ix^i\) ,保证有解。系数对 \(998244353\) 取模,\(n\le 10^5\)

Solution

考虑构造函数 \(g(f(x))=\frac{1}{f(x)}-h(x)\),代入多项式牛顿迭代得:

\[f(x)\equiv f_0(x)-\frac{\frac{1}{f_0(x)}-h(x)}{-\frac{1}{f_0^2(x)}}\pmod{x^n} \]

\[f(x)\equiv 2f_0(x)-h(x)f_0^2(x)\pmod{x^n} \]

直接递归使用 NTT 计算即可,时间复杂度 \(T(n)=T(\frac{n}{2})+O(n\log{n})=O(n\log{n})\)

多项式开根

Problem

\(B^2(x)\equiv A(x)\pmod{x^n}\),其中 \(A(x)=\sum_{i=0}^{n-1}a_ix^i\) ,若有多解,选择零系数最小的解。系数对 \(998244353\) 取模,\(n\le 10^5\)

Solution

待续。

多项式 ln

Problem

\(\exp{B(x)}\equiv A(x)\pmod{x^n}\),其中 \(A(x)=\sum_{i=0}^{n-1}a_ix^i\) ,保证 \(a_0=1\)。系数对 \(998244353\) 取模,\(n\le 10^5\)

Solution

\(\ln{f(x)}\) 存在,必须满足 \([x^0]f(x)=0\)

\(g(x)=\ln{f(x)}\),其中 \(f(x)\) 为给定多项式,\(g(x)\) 为目标多项式。

\(x\) 求导,得:

\[g'(x)=\frac{f'(x)}{f(x)} \]

根据 \([x^{i}]g'(x)=(i+1)[x^{i+1}]g(x)\),我们可利用 \(g'(x)\) 得到 \(g(x)\)

带入 \(x=0\) 可知,\(\exp{g(x)}\) 存在的前提是 \([x^0]g(x)=0\)

计算 \(g'(x)\) 使用多项式求逆即可。

时间复杂度 \(O(n\log{n})\)

多项式 EXP

Problem

\(B(x)\equiv \exp{A(x)}\pmod{x^n}\),其中 \(A(x)=\sum_{i=0}^{n-1}a_ix^i\) ,保证 \(a_0=1\)。系数对 \(998244353\) 取模,\(n\le 10^5\)

Solution

显然 \(h(x)=\ln{f(x)}\),我们直接构造函数 \(g(f(x))=\ln{f(x)}-h(x)\),并求解其零点。

求解函数 \(g(f(x))\) 直接带入牛顿迭代公式即可,我们可以得到 \(g(f(x))\equiv f_0(x)-\frac{\ln{f(x)}-h(x)}{\frac{1}{f_0(x)}}\pmod{x^n}\),化简可得:

\[g(f(x))\equiv f_0(x)(1-\ln{f_0(x)}+h(x))\pmod{x^n} \]

计算 \(\ln{f_0(x)}\) 直接利用多项式 ln 算法即可,该部分时间复杂度 \(O(n\log{n})\)

时间复杂度 \(T(n)=T(\frac{n}{2})+O(n\log{n})=O(n\log{n})\)

多项式多点求值

多项式多点求值

待更新。

2024 北京市赛 E

待更新。

2024 ICPC 昆明邀请赛 H

待更新。

posted @ 2024-07-26 22:44  changle_knh  阅读(99)  评论(0)    收藏  举报