多项式小记
先粘个
inline void times(LL *f,LL *g,int n,int lim){
int kn=initr(n); NTT(f,kn,1); NTT(g,kn,1);
for(int i=0;i<kn;i++) f[i]=f[i]*g[i]%Mod;
NTT(f,kn,-1); NTT(g,kn,-1);
clr(f,lim,kn);
}
分治
大概就是维护下面这种较简单半在线卷积。
给定序列
其中
运用
先求解
策略:
模板题代码:
void DivNTT(int L,int R){
if(L==R-1) return ;
int mid=(L+R)/2,p=R-L; DivNTT(L,mid);
cpy(f2,f+L,p/2); cpy(g2,g,p); clr(f2,p/2,2*p); clr(g2,p,2*p);
times(f2,g2,2*p);
for(int i=mid;i<R;i++) (f[i]+=f2[i-L])%=Mod;
DivNTT(mid,R);
}
具体分治过程应视题目而定。
更加真实的半在线卷积:
已知
令
这样按照我们原先的分治方法是不行的,因为右半部分的
正确策略:
-
时 -
时
void solve(int L,int R){
if(L+1==R) { if(L) g[L]=(g[L-1]+f[L])%Mod; return ;}
int mid=(L+R)/2,p=R-L; solve(L,mid);
if(!L){
cpy(f2,f,p/2); clr(f2,p/2,p);
cpy(g2,g,p/2); clr(g2,p/2,p);
times(f2,g2,p,0);
for(int i=mid;i<R;i++) (f[i]+=f2[i-1])%=Mod;
}
else {
else {
cpy(f2,f+L,p/2); clr(f2,p/2,p); cpy(g2,g,p);
times(f2,g2,p,0);
for(int i=mid;i<R;i++) (f[i]+=f2[i-1-L])%=Mod;
cpy(g2,g+L,p/2); clr(g2,p/2,p); cpy(f2,f,p);
times(f2,g2,p,0);
for(int i=mid;i<R;i++) (f[i]+=f2[i-1-L])%=Mod;
}
}
solve(mid,R);
}
例题:ABC315EX
多项式求逆
给定多项式
求解:
采用倍增的过程。
我们已经求出了
因为
所以
平方得
移项,同乘
不断倍增求出
void invp(LL *f,int n){
static LL g[M+5],h[M+5],ff[M+5];int p=2;
g[0]=Pow(f[0],Mod-2);
for(;p<(n<<1);p<<=1){
int pn=p<<1; cpy(ff,f,p); cpy(h,g,p);
initr(pn); NTT(ff,pn,1); NTT(h,pn,1);
for(int i=0;i<pn;i++) g[i]=((2ll-ff[i]*h[i]%Mod)*h[i]%Mod+Mod)%Mod;
NTT(g,pn,-1); clr(g,p,pn);
}
cpy(f,g,n); clr(g,0,p); clr(h,0,p); clr(ff,0,p);
}
多项式开根
同样地倍增。
给定多项式
多项式
在模板题中,常数项为
已知
平方,
void Sqrtp(LL *f,int n){
static LL ff[M+5],gg[M+5],g[M+5]; memset(g,0,sizeof(g));
g[0]=1; int p=2;
for(;p<(n<<1);p<<=1) {
int pn=p<<1; cpy(ff,f,p); cpy(gg,g,p);
invp(gg,p); initr(pn);
NTT(ff,pn,1); NTT(gg,pn,1);
for(int i=0;i<pn;i++) ff[i]=ff[i]*gg[i]%Mod;
NTT(ff,pn,-1);
for(int i=0;i<p;i++) g[i]=(g[i]+ff[i])%Mod*inv2%Mod;
clr(g,p,pn);
}
cpy(f,g,n); clr(g,0,p); clr(ff,0,p); clr(gg,0,p);
}
多项式除法
给定
满足
其中
定义
例子:如
因为
所以
同时乘
得
得到
求出
可能是对的代码???
inline void rev(LL *f,int n){
for(int i=0,j=n-1;i<j;i++,j--) swap(f[i],f[j]);
}
inline void mof(LL *f,LL *g,int n,int m){
static LL q[M+5],r[M+5];
int L=n-m+1;
rev(g,m); cpy(q,g,L); rev(g,m); invp(q,L);
rev(f,n); cpy(r,f,L); rev(f,n); times(q,r,L+L-1,L);
rev(q,L); prta(g,m+L-1);
times(g,q,m+L-1,m-1);
for(int i=0;i<m-1;i++) g[i]=(f[i]-g[i]+Mod)%Mod;
cpy(f,q,L); clr(f,L,n); clr(q,0,m); clr(r,0,L);
}
一些看不懂的东西:
简单微积分:
定义多项式
-
定义复合多项式
。 -
定义
的求导: 。 -
定义
的积分: 。 -
复合多项式的求导:根据链式法则得,若
,同时对两边得主元 求导,则有
inline void Getdao(LL *f,int n){
for(int i=1;i<n;i++) f[i-1]=f[i]*i%Mod;
f[n-1]=0;
}
inline void Getjf(LL *f,int n){
for(int i=n-1;i>=0;i--) f[i]=f[i-1]*inv[i]%Mod;
f[0]=0;
}
看得出来,积分和求导其实是互逆的过程。
多项式牛顿迭代 。
已知函数
定义
结论:
如此倍增的复杂度为
多项式对数函数和指数函数(多项式 ln)
若
若
由麦克劳林级数定义:
一些性质:
给定多项式
ln
给定多项式
对
inline void lnp(LL *f,int n){
static LL g[M+5];
cpy(g,f,n); invp(g,n);
Getdao(f,n); times(f,g,n+n-1,n);
Getjf(f,n); clr(g,0,n);
}
exp
给定多项式
利用牛顿迭代求
根据
inline void exp(LL *f,int n){
static LL g[M+5],gg[M+5]; int p=2;
g[0]=1;
for(;p<(n<<1);p<<=1){
cpy(gg,g,p); lnp(gg,p);
for(int i=0;i<p;i++) gg[i]=(f[i]-gg[i]+Mod)%Mod;
gg[0]=(gg[0]+1)%Mod; times(g,gg,p*2,p);
}
cpy(f,g,p); clr(g,0,p); clr(gg,0,p);
}
多项式快速幂
给定
暴力
对于常见的题目中,一般是加速
这种做法还有以下优点:
见例题: 有
但是我们思考以下,这个矩阵相乘的形式为:
这是一个加法卷积的形式,我们可以做一遍加法卷积之后再让
然后用暴力的倍增求快速幂即可。但是
利用 和 。
模板题弱化版:保证常数项为
见
inline void polypow(LL *f,int n,int k){
lnp(f,n);
for(int i=0;i<n;i++) f[i]=f[i]*k%Mod;
exp(f,n);
}
强化版 :
不保证常数项为
我们可以取一个常数
那么
但是这里,
所以我们找到次数最小的非零项 设为
左边这个多项式的快速幂可以用上面的代码求出。
在这个结果前面接
注意,这里的
inline void polypow(LL *f,int n,int k1,int k2){
int px=0; while(f[px]==0 && px<n) px++;
if(px==n) return ;
if(1ll*k2*px>=n) {clr(f,0,n); return ;}
LL iv1=Pow(f[px],Mod-2),x=Pow(f[px],k2);
for(int i=px;i<n;i++) f[i]=f[i]*iv1%Mod;
lnp(f+px,n-px);
for(int i=px;i<n;i++) f[i]=f[i]*k1%Mod;
exp(f+px,n-px);
for(int i=px;i<n;i++) f[i]=f[i]*x%Mod;
static LL g[M+5];
for(int i=k2*px;i<n;i++) g[i]=f[px+i-k2*px];
cpy(f,g,n); clr(g,0,n);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】