多项式
乘法逆
题面
给定一个多项式 \(F(x)\),请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 \pmod{x^n}\)。
系数对 \(998244353\) 取模。
为方便 NTT 和倍增,不妨设 \(n\) 为 \(2\) 的幂。
我们有两种方法。
倍增
首先,若 \(n=1\),答案为 \([x^0]F(x)\) 的乘法逆元。
假设我们求出了 \(\bmod x^{n/2}\) 的逆,设为 \(H(x)\)。
接下来就是柿子环节
我们就得到了递推式。
牛迭

Konata:多项式牛顿迭代法,不止用来求逆用的。

Konata:求逆的话就是在上面证明基础上直接用就好了。
代码 / 时间复杂度
注意多项式项数 / 边界等细节,可看注释。
时间:
由主定理,时间复杂度为 \(O(n\log n)\)。
乘转加
例题
题面够简化了,不需要再补充了。
做法
如果将「数列中所有数的乘积」改成「加和」那就好做了,将 \(S\) 中的元素移到 \(x\) 的指数上去然后多项式快速幂即可。
但是这里是「乘积」,咋办?
首先,因为题目要求最后的结果(题面中的 \(x\))不是 \(0\),所以我们可以把 \(S\) 中的 \(0\) 全部删去。
其次,由于 \(m\) 是素数,这篇说到只有 \(1,2,4,p^k,2p^k\)(\(p\) 为奇素数)有原根。
\(\bmod p(p\in\text{prime})\) 意义下的乘法可以转化为 \(\bmod (p-1)\) 意义下的加法,转化途径就是原根。
也就是说,我们本来的思路是 \(\log(xy)=\log(x)+\log(y)\) 用对数转化的,但是我们只支持自然数啊。所以我们打算「以原根为底求 \(\log\)」设我们求出 \(m\) 的原根有 \(g\),我们把 \(1,\dots,m-1\) 都表示为
的形式,这时她的对数就是这里的指数 \(k\)。
所以我们把这个对数放到 \(x\) 的指数上去,然后多项式快速幂即可,注意我们每次将多项式压进 \(x\) 指数 \(\bmod (m-1)\) 的同余系里。
导数积分
ln & exp
\(\ln G\) 有意义 \(\iff [x^0]G=1\)
\(\exp F\) 有意义 \(\iff [x^0]F=0\)
用多项式乘法逆即可线性对数求出多项式 \(\ln\)。
更好写的 \(O(n^2)\) 多项式 \(\exp\) 求法:
设 \(f_i=[x^i]F,g_i=[x^i]G\),由 \(\dagger\) 式得:
将上式移项有 \(O(n^2)\) 多项式 \(\ln\) 求法:
作者:ShaoJia,欢迎分享本文,转载时敬请注明原文来源链接。

浙公网安备 33010602011771号