乘法逆
题面
P4238 【模板】多项式乘法逆
给定一个多项式 F(x),请求出一个多项式 G(x), 满足 F(x)∗G(x)≡1(modxn)。
系数对 998244353 取模。
为方便 NTT 和倍增,不妨设 n 为 2 的幂。
我们有两种方法。
倍增
首先,若 n=1,答案为 [x0]F(x) 的乘法逆元。
假设我们求出了 modxn/2 的逆,设为 H(x)。
接下来就是柿子环节
FH≡1(modxn/2)FH−1≡0(modxn/2)(FH−1)2≡0(modxn)F2H2−2FH+1≡0(modxn)2FH−F2H2≡1(modxn)F(2H−FH2)≡1(modxn)G≡2H−FH2(modxn)
我们就得到了递推式。
牛迭

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

Konata:求逆的话就是在上面证明基础上直接用就好了。
代码 / 时间复杂度
注意多项式项数 / 边界等细节,可看注释。
record
时间:
T(n)=T(n2)+nlogn
由主定理,时间复杂度为 O(nlogn)。
乘转加
例题
P3321 [SDOI2015]序列统计
题面够简化了,不需要再补充了。
做法
如果将「数列中所有数的乘积」改成「加和」那就好做了,将 S 中的元素移到 x 的指数上去然后多项式快速幂即可。
但是这里是「乘积」,咋办?
首先,因为题目要求最后的结果(题面中的 x)不是 0,所以我们可以把 S 中的 0 全部删去。
其次,由于 m 是素数,这篇说到只有 1,2,4,pk,2pk(p 为奇素数)有原根。
modp(p∈prime) 意义下的乘法可以转化为 mod(p−1) 意义下的加法,转化途径就是原根。
也就是说,我们本来的思路是 log(xy)=log(x)+log(y) 用对数转化的,但是我们只支持自然数啊。所以我们打算「以原根为底求 log」设我们求出 m 的原根有 g,我们把 1,…,m−1 都表示为
gkmodm(k∈[0,φ(m)−1(=m−2)]∩N)
的形式,这时她的对数就是这里的指数 k。
所以我们把这个对数放到 x 的指数上去,然后多项式快速幂即可,注意我们每次将多项式压进 x 指数 mod(m−1) 的同余系里。
record
导数积分
dxndx=nxn−1
∫xndx=xn+1n+1
ln & exp
G=expFG′=F′expFG′=F′G†F=∫G′GlnG=∫G′G
lnG 有意义 ⟺[x0]G=1
expF 有意义 ⟺[x0]F=0
用多项式乘法逆即可线性对数求出多项式 ln。
更好写的 O(n2) 多项式 exp 求法:
设 fi=[xi]F,gi=[xi]G,由 † 式得:
(i+1)gi+1=i∑j=0(i−j+1)fi−j+1gj(i≥0,g0=1)
将上式移项有 O(n2) 多项式 ln 求法:
(i+1)g0fi+1=(i+1)gi+1−i∑j=1jgi+1−jfj(i≥0,f0=0)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义