多项式

乘法逆

题面

P4238 【模板】多项式乘法逆

给定一个多项式 F(x),请求出一个多项式 G(x), 满足 F(x)G(x)1(modxn)

系数对 998244353 取模。

为方便 NTT 和倍增,不妨设 n2 的幂。

我们有两种方法。

倍增

首先,若 n=1,答案为 [x0]F(x) 的乘法逆元。

假设我们求出了 modxn/2 的逆,设为 H(x)

接下来就是柿子环节

FH1(modxn/2)FH10(modxn/2)(FH1)20(modxn)F2H22FH+10(modxn)2FHF2H21(modxn)F(2HFH2)1(modxn)G2HFH2(modxn)

我们就得到了递推式。

牛迭

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

Konata:求逆的话就是在上面证明基础上直接用就好了。

代码 / 时间复杂度

注意多项式项数 / 边界等细节,可看注释。

record

时间:

T(n)=T(n2)+nlogn

主定理,时间复杂度为 O(nlogn)

乘转加

例题

P3321 [SDOI2015]序列统计

题面够简化了,不需要再补充了。

做法

如果将「数列中所有数的乘积」改成「加和」那就好做了,将 S 中的元素移到 x 的指数上去然后多项式快速幂即可。

但是这里是「乘积」,咋办?

首先,因为题目要求最后的结果(题面中的 x)不是 0,所以我们可以把 S 中的 0 全部删去。

其次,由于 m 是素数,这篇说到只有 1,2,4,pk,2pkp 为奇素数)有原根。

modp(pprime) 意义下的乘法可以转化为 mod(p1) 意义下的加法,转化途径就是原根。

也就是说,我们本来的思路是 log(xy)=log(x)+log(y) 用对数转化的,但是我们只支持自然数啊。所以我们打算「以原根为底求 log」设我们求出 m 的原根有 g,我们把 1,,m1 都表示为

gkmodm(k[0,φ(m)1(=m2)]N)

的形式,这时她的对数就是这里的指数 k

所以我们把这个对数放到 x 的指数上去,然后多项式快速幂即可,注意我们每次将多项式压进 x 指数 mod(m1) 的同余系里。

record

导数积分

dxndx=nxn1

xndx=xn+1n+1

ln & exp

G=expFG=FexpFG=FGF=GGlnG=GG

lnG 有意义 [x0]G=1

expF 有意义 [x0]F=0

用多项式乘法逆即可线性对数求出多项式 ln

更好写的 O(n2) 多项式 exp 求法:

fi=[xi]F,gi=[xi]G,由 式得:

(i+1)gi+1=j=0i(ij+1)fij+1gj(i0,g0=1)

将上式移项有 O(n2) 多项式 ln 求法:

(i+1)g0fi+1=(i+1)gi+1j=1ijgi+1jfj(i0,f0=0)

posted @   ShaoJia  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示