拉格朗日插值法
这个也没啥太特别,就是很快速的求出了一个多项式的某一项
直接上公式:
\[\huge f_i(x)=\frac{\prod\limits_{j\not = i}(x-x_j)}{\prod\limits_{j\not = i}(x_i-x_j)}*y_i
\]
\[\huge g(x)=\sum_{i=0}^nf_i(x)
\]
证明不想说,只是为了自己复习用
code
int ksm(int x,int y){
int ret=1;
while(y){
if(y&1)ret=ret*x%mod;
x=x*x%mod;y>>=1;
}return ret;
}
int lglr(int *x,int *y,int t,int c){
int ret=0;
fo(i,1,c+1){
int fz=1,fm=1;
fo(j,1,c+1)if(i!=j){
fz=fz*(t-x[j]+mod)%mod;
fm=fm*(x[i]-x[j]+mod)%mod;
}
ret=(ret+fz*ksm(fm,mod-2)%mod*y[i])%mod;
}
return ret;
}
拉格朗日插值求系数\(\mathcal{O(n^3)}\)
code
int tp[N],tq[N];
void lglrxs(int *x,int *y,int c,int *xs){
fo(i,1,c+1){
int fm=1;tp[0]=1;
fo(j,1,c+1)if(i!=j){
fm=fm*(x[i]-x[j]+mod)%mod;
fo(k,0,c)tq[k]=tp[k],tp[k]=0;
fo(k,1,c)tp[k]=tq[k-1];
fo(k,0,c)tp[k]=(tp[k]-tq[k]*x[j]%mod+mod)%mod;
}
int inv=ksm(fm,mod-2);
fo(k,0,c)xs[k]=(xs[k]+tp[k]*inv%mod*y[i]%mod)%mod,tp[k]=0;
}
}
关于多项式次数
这个东西吧经常用差分法证明,如果差分是\(n\)次多项式,那么当前就是\(n+1\)次多项式
QQ:2953174821