拉格朗日插值学习

解决的问题

已知 $n$ 次函数上的 $n$ 个不同点,求解析式/某个 $f(x)$ 的值。

方法

我们可以用一个通用的方法构造一个满足条件的函数:

\[\begin{aligned} f(x) =&\{y_1 \cdot \frac{(x-x_2)(x-x_3)...(x-x_n)}{(x_1-x_2)(x_1-x_3)...(x_1-x_n)}\}\\ +&\{y_2 \cdot \frac{(x-x_1)(x-x_3)...(x-x_n)}{(x_2-x_1)(x_2-x_3)...(x_2-x_n)}\}\\ +&\{y_3 \cdot \frac{(x-x_1)(x-x_2)...(x-x_n)}{(x_3-x_1)(x_3-x_2)...(x_3-x_n)}\}\\ ...\\ +&\{y_n \cdot \frac{(x-x_1)(x-x_2)...(x-x_{n-1})}{(x_n-x_1)(x_n-x_2)...(x_n-x_{n-1})}\}\\ \end{aligned}\]

模版

Luogu P4781

int n,k,x[2020],y[2020];
int main(){
    scanf("%d%d",&n,&k);
    ll ans=0;
    for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
    for(int i=1;i<=n;++i){
        ll a=1,b=1;
        (a*=y[i])%=mod;
        for(int j=1;j<=n;++j){
            if(i==j)continue;
            (a*=(k-x[j]))%=mod;
            (b*=(x[i]-x[j]))%=mod;
        }
        a*=inv(b);
        a%=mod;a+=mod;a%=mod;
        (ans+=a)%=mod;
    }
    printf("%lld\n",ans);
}