多项式模板整理
约定#
多项式乘法基础#
详情见 多项式乘法入门
多项式求逆#
给出
我们逐一递推,假设已知
把带
该算法的时间复杂度为
我们尝试使用 倍增法 求解。
若我们已知
那么由于
模数变为
两式相减得
为了把模数变为
同时乘
展开
带入
得
移项得
其实也可以牛顿迭代。
点击查看代码
ll Q[maxn],P[maxn],o[maxn],t;
void Getinv(ll *a,ll *b,ll n){
for(ll i=0;i<n;i++) Q[i]=0; t=0;
while(n>1) o[++t]=n, n=n+1>>1;
Q[0]=power(a[0]); o[++t]=1;
for(ll i=t-1;i;i--){
for(ll j=0;j<o[i+1];j++) P[j]=Q[j];
mul(P,P,P,o[i+1],o[i+1],o[i]);
mul(a,P,P,o[i],o[i],o[i]);
for(ll j=0;j<o[i];j++) Q[j]=(2*Q[j]-P[j]+mod)%mod;
}
for(ll i=0;i<o[1];i++) b[i]=Q[i];
}
时间复杂度
多项式求导与积分#
求导:
积分:
积分不会书写。
注意
多项式 #
计算
两边同时求导
链式法则得
两边积分一下就行了,
点击查看代码
ll R[maxn];
void ln(ll *a,ll *b,ll n){
dao(a,R,n);
Getinv(a,b,n);
mul(b,R,R,n,n,n);
jifen(R,b,n);
}
多项式 #
设
根据牛顿迭代,我们求出了
分治即可,
点击查看代码
ll z[maxn],zlt,F[maxn],G[maxn];
void Exp(ll *a,ll *b,ll n){
zlt=0;
for(ll i=0;i<n;i++) F[i]=0;
while(n>1) z[++zlt]=n, n=n+1>>1;
z[++zlt]=1; F[0]=1;
for(ll i=zlt-1;i;i--){
ln(F,G,z[i]);
for(ll j=0;j<z[i];j++) G[j]=(a[j]<G[j]? a[j]+mod-G[j]:a[j]-G[j]);
G[0]=(G[0]==mod-1? 0:G[0]+1);
mul(F,G,F,z[i+1],z[i],z[i]);
}
for(ll i=0;i<z[1];i++) b[i]=F[i];
}
多项式开根#
设
和
点击查看代码
void Sqrt(ll *a,ll *b,ll n){
zlt=0;
for(ll i=0;i<n;i++) F[i]=0;
while(n>1) z[++zlt]=n, n=n+1>>1;
z[++zlt]=1; F[0]=1;
for(ll i=zlt-1;i;i--){
mul(F,F,G,z[i+1],z[i+1],z[i]);
for(ll j=0;j<z[i];j++) G[j]=(G[j]+a[j]>=mod? G[j]+a[j]-mod:G[j]+a[j]);
for(ll j=0;j<z[i+1];j++) F[j]=((F[j]<<1)>=mod? (F[j]<<1)-mod:F[j]<<1);
Getinv(F,F,z[i]);
mul(G,F,F,z[i],z[i],z[i]);
}
for(ll i=0;i<z[1];i++) b[i]=F[i];
}
多项式除法#
已知
若
推导:
上式中形如
注意到右边有一项
意义下:
注意到
带入
多项式快速幂#
给出多项式
考虑到
但是
常系数齐次线性递推#
已知对于
设
构造多项式
显然,
那么若
这相当于多项式取模。但是
部分代码合集
点击查看代码
ll power(ll a,ll b=mod-2){
ll s=1;
while(b){
if(b&1) s=s*a%mod;
a=a*a%mod; b>>=1;
} return s;
}
struct POLY{
ll rev[maxn<<2], tr, inv[maxn<<2];
void Getrev(ll n){
if(tr==n) return; tr=n;
for(ll i=1;i<n;i++)
rev[i]=(rev[i>>1]>>1)|(i&1? n>>1:0);
}
void ntt(ll *a,ll n){
Getrev(n);
for(ll i=1;i<n;i++)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(ll i=1;i<n;i<<=1){
ll g=power(3,(mod-1)/(i<<1));
for(ll j=0;j<n;j+=(i<<1))
for(ll k=0,g0=1;k<i;k++,g0=g0*g%mod){
ll x=a[j|k], y=a[i|j|k]*g0%mod;
a[j|k]=(x+y>=mod? x+y-mod:x+y), a[i|j|k]=(x<y? x+mod-y:x-y);
}
}
}
ll A[maxn<<2], B[maxn<<2];
void mul(ll *a,ll *b,ll *c,ll n,ll m,ll k){
for(ll i=0;i<n;i++) A[i]=a[i];
for(ll i=0;i<m;i++) B[i]=b[i];
ll l=1;
while(l<n+m-1) l<<=1;
ntt(A,l), ntt(B,l);
for(ll i=0;i<l;i++) A[i]=A[i]*B[i]%mod;
ntt(A,l), reverse(A+1,A+l);
ll Inv=power(l);
for(ll i=0;i<l;i++){
if(i<k) c[i]=A[i]*Inv%mod;
A[i]=B[i]=0;
}
for(ll i=l;i<k;i++) c[i]=0;
}
ll Q[maxn],P[maxn],o[maxn],t;
void Getinv(ll *a,ll *b,ll n){
for(ll i=0;i<n;i++) Q[i]=0; t=0;
while(n>1) o[++t]=n, n=n+1>>1;
Q[0]=power(a[0]); o[++t]=1;
for(ll i=t-1;i;i--){
for(ll j=0;j<o[i+1];j++) P[j]=Q[j];
mul(P,P,P,o[i+1],o[i+1],o[i]);
mul(a,P,P,o[i],o[i],o[i]);
for(ll j=0;j<o[i];j++) Q[j]=(2*Q[j]-P[j]+mod)%mod;
}
for(ll i=0;i<o[1];i++) b[i]=Q[i];
}
void dao(ll *a,ll *b,ll n){
for(ll i=1;i<n;i++) b[i-1]=a[i]*i%mod;
}
ll r=0;
void jifen(ll *a,ll *b,ll n){
while(r<n){
++r;
if(r>1) inv[r]=(mod-mod/r)*inv[mod%r]%mod;
else inv[r]=1;
}
for(ll i=n-1;i>0;i--) b[i]=a[i-1]*inv[i]%mod;
b[0]=0;
}
ll R[maxn];
void ln(ll *a,ll *b,ll n){
dao(a,R,n);
Getinv(a,b,n);
mul(b,R,R,n,n,n);
jifen(R,b,n);
}
ll z[maxn],zlt,F[maxn],G[maxn];
void Exp(ll *a,ll *b,ll n){
zlt=0;
for(ll i=0;i<n;i++) F[i]=0;
while(n>1) z[++zlt]=n, n=n+1>>1;
z[++zlt]=1; F[0]=1;
for(ll i=zlt-1;i;i--){
ln(F,G,z[i]);
for(ll j=0;j<z[i];j++) G[j]=(a[j]<G[j]? a[j]+mod-G[j]:a[j]-G[j]);
G[0]=(G[0]==mod-1? 0:G[0]+1);
mul(F,G,F,z[i+1],z[i],z[i]);
}
for(ll i=0;i<z[1];i++) b[i]=F[i];
}
void Sqrt(ll *a,ll *b,ll n){
zlt=0;
for(ll i=0;i<n;i++) F[i]=0;
while(n>1) z[++zlt]=n, n=n+1>>1;
z[++zlt]=1; F[0]=1;
for(ll i=zlt-1;i;i--){
mul(F,F,G,z[i+1],z[i+1],z[i]);
for(ll j=0;j<z[i];j++) G[j]=(G[j]+a[j]>=mod? G[j]+a[j]-mod:G[j]+a[j]);
for(ll j=0;j<z[i+1];j++) F[j]=((F[j]<<1)>=mod? (F[j]<<1)-mod:F[j]<<1);
Getinv(F,F,z[i]);
mul(G,F,F,z[i],z[i],z[i]);
}
for(ll i=0;i<z[1];i++) b[i]=F[i];
}
}D;
出处:https://www.cnblogs.com/Sktn0089/p/18022061
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下