天天看点

拉格朗日插值法

这个也没啥太特别,就是很快速的求出了一个多项式的某一项

直接上公式:

\[\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)}\)

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