N天前修习了一下多项式,就简要记录一下好了
多项式求逆:对于
当n=1时B(x)就是A(x)常数项的逆元
当n>1时,考虑倍增
令A(x)Bk(x)=1(mod xk)
假设已知B⌈n2⌉
则A(x)B⌈n2⌉(x)=1(mod x⌈n2⌉)
由于A(x)Bn(x)=1(mod xn)=1(mod x⌈n2⌉)
故B⌈n2⌉(x)−Bn(x)=0(mod x⌈n2⌉)
平方一下可以得到(⌈n2⌉的作用是保证翻倍后大于n)
两边乘A(x)得A(x)B⌈n2⌉(x)2−2∗B⌈n2⌉(x)+Bn(x)=0(mod xn)
则:Bn(x)=B⌈n2⌉(x)∗(2−A(x)B⌈n2⌉(x))
每层做一次卷积即可,复杂度为O(nlogn+(n/2)log(n/2)+...)=O(nlogn)
多项式除法:有了多项式求逆,就可以做多项式除法了
A(x)=B(x)P(x)+R(x) 其中P(x)为商式,R(x)为余式
令n,m为A(x),B(x)的长度
考虑如何消去R(x)的影响
则xn−1A(x−1)=xm−1B(x−1)xn−mP(x−1)+xn−1R(x−1)
由于xnF(x)=FR(x),即F(x)反转
即AR(x)=BR(x)PR(x)+xn−m+1RR(x)
即AR(x)=BR(x)PR(x)(mod xn−m+1)
求出多项式逆元后乘起来就求出了P(x),用P(x)就能求出R(x)了
多项式多点求值
假设现在有个多项式F(x),然后有若干ai,要对于这些ai求F(ai)的值。
考虑分治,假设我已经求到了[l,r]的ai,那么F(x)。
其实写起来特别简单,大概是这样:
void solve(int o,int l,int r,Poly u){
u=u%s[o];
if(l==r){
ans[l]=u[0];
return ;
}
int mid=l+r>>1;
solve(o<<1,l,mid,u,v);
solve(o<<1|1,mid+1,r,u,v);
}
时间复杂度O(nlog2n)