多项式

多项式的表示

系数表示法

F(x)=a0x0+a1x1+...+anxn

点值表示法

一个n次多项式可以被n+1个点唯一确定

可以用这n+1个点表示该多项式

多项式卷积

(fg)(x)=i=0nj=0naibjxi+j

说白了就是暴力展开

快速傅里叶变换(FFT)

单位根

对于复数ω满足ωn=1,则称$\omega n$次单位根

对应为复平面上平分单位圆的n个单位向量

可用复数的三角表示构成,也可用欧拉公式

性质

1、ωnk=ω2n2k

2、ωnk=ωnk+n2

3、ωn0=ωnn=1

对应到复平面很好理解

DFT离散快速傅里叶变化

即把多项式用n次单位根转成点值表示法

对于多项式F(x)=a0x0+a1x1+...+an1xn1n2p

奇偶分项:F(x)=a0x0+a2x2+...+an2xn2+x(a1x0+a3x2+...+an1xn2)

设多项式G(x)=a0x0+a2x1+...+an2xn21,H(x)=a1x0+a3x1+...+an1xn21

则有F(x)=G(x2)+xH(x2)

1k<n2,将单位根ωnkωnk+n2带入,则

F(ωnk)=G((ωnk)2)+ωnkH((ωnk)2)

=G(ωn2k)+ωnkH(ωn2k)

=G(ωn2k)+ωnkH(ωn2k)

F(ωnk+n2)=G((ωnk+n2)2)+ωnk+n2H((ωnk+n2)2)

=G(ωn2k+n)+ωnk+n2H(ωn2k+n)

=G(ωn2k)ωnkH(ωn2k)

G,H递归求出各自的点值表示(ωn21,ωn22,...,ωn2n21),就可以O(n)得到F的点值表示

IDFT快速傅里叶逆变换

即把单位根全部取倒数跑一边DFT,得到每个数除以n,可得到新的多项式

迭代FFT

(待补充)

快速数论变换(NTT)

[xi](fg)(x) modp

简单来说就是把单位根换成原根

原根的性质:

1、对于质数p的原根gg1,g2,...gp1互不相同

2、单位根的三个性质都有

因此,可以进行模意义下的DFT和IDFT

原根的使用

类比单位根,我们可以认为g1,g2,...gp1p1个数把单位圆均分成p1份,可以通过均等间隔选点来改变切割份数,也就是说,如果想用gi代替ωnk,就必须满足p1n的整数倍

998244353=717223+1,g=3223一般可以满足分治需求的份数

任意模数下NTT(MTT)

多项式的运算

多项式求逆

求多项式G(x),使得F(x)G(x)1(modxn)

这里的模运算其实是砍掉xn及以后的项

利用倍增求解:

H(x)满足F(x)H(x)1(modxn2)

且易知F(x)G(x)1(modxn2)

则有F(x)(G(x)H(x))0(modxn2)

G(x)H(x)0(modxn2)

(G(x)H(x))20(modxn2)

G(x)22G(x)H(x)+H(x)20(modxn2)

G(x)22G(x)H(x)+H(x)20(modxn)

乘上F(x),根据F(x)G(x)1(modxn)

G(x)2H(x)+F(x)H(x)20(modxn)

G(x)2H(x)F(x)H(x)2(modxn)

细节

注意生成G(x)=2H(x)F(x)H2(x)时,要把G(x)02p1次项全部算出来(而不是只算前n项)

因为在系数-点值表示相互转换时,各项都是互相依赖的(唯一地表示一个多项式),只做一点会导致多项式不正确

多项式求ln

多项式求exp

多项式开根

生成函数

拉格朗日插值

定义

我们知道,n个点可以唯一确定一个n1次多项式(如三点确定一个二次函数)

那么拉格朗日插值就是根据这个原理形成的多项式表示法

对于n个点(x1,y1),(x2,y2),...,(xn,yn),有

F(x)=i=1nyij=1n,jixxjxixj

利用该插值表示法,可以绕过求系数表示法,O(n2)求出F(x)

编号连续的插值

xi=i,及x[1,n],则有

F(x)=i=1nyij=1n,jixjij

发现该式分子分母分别整合得到:

F(x)=i=1nyij=1n(xj)(xi)(1)ni(i1)!(ni)!

通过预处理阶乘逆元facinv[]数组和j=1n(xj),可以将时间复杂度降至O(nlogn)(再预处理(xi)1可以达到O(n)

拉插优化DP

原理:n次多项式求前缀和后为n+1次多项式,即Fn+1(n)=[Fn(1),Fn(1)+Fn(2), ... ,i=1nFn(i), ... ]

(详见题解

所以对于满足状态f[]为多项式的DP,可以通过拉插来求出多项式

The Sum of the k-th Powers

经典模型:
i=1nik

差分发现为n次多项式,故答案为n+1次多项式,拉插即可

P3643 [APIO2016] 划艇

f[i][j]为学校ij艘划艇,列出方程:

f[i][j]={k=1il=1jf[k][l] ,ljr0,otherwise

前缀和:

f[i][j]={k=1j[i1][k] ,ljrf[i1][j],otherwise

由于i=1时,f[i][j]=1,为0次多项式,则f[i][j]也是多项式

又注意到l,r范围很大,考虑离散化

但是离散化之后,原数列被分成若干段,且每段状态不一(如f[1][]会有0/1),不能用一个多项式表示,但是每段状态是一样的,可以用一个多项式表示

于是引出分段多项式做法:每一段维护一个多项式,总时间复杂度O(n3)

p.s. 题解普遍用的是组合数,可以试试

p.s.s. 拉插优化DP要注意常数优化

posted @   Zhone_lb  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示