1. 程式人生 > >【總結】 拉格朗日差值

【總結】 拉格朗日差值

傳送門


拉格朗日差值其實很簡單,而且證明也很明顯。雖然聯賽不一定會考這個東西,但是還是要寫一下總結。
大致的公式就是\(\sum_{i=1}^ny_i\prod_{j=1}^n\frac{(x-x_j)}{(x_i-x_j)}(j!=i)\)
證明也不難,然後如果x是連續的話可以字首字尾積一下。

#include<stdio.h>
#include<math.h>
#define ll long long
const int N=2010;
const ll Mod=998244353;
ll x[N],y[N],n,k;
ll Pow(ll a,ll b){
    ll ret=1;
    while(b){
        if(b&1)ret=(ret*a)%Mod;
        a=(a*a)%Mod;b>>=1;
    }
    return ret;
}
ll lalr(){
    ll ans=0;
    for(int i=1;i<=n;i++){
        ll Up=1,Down=1;
        for(int j=1;j<=n;j++)
            if(i!=j){
                (Up*=(k-x[j]))%=Mod;
                (Down*=(x[i]-x[j]))%=Mod;
            }
        (ans+=(y[i]*Up)%Mod*Pow(Down,Mod-2))%=Mod;
    }
    return ans;
}
int main(){
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld%lld",&x[i],&y[i]);
    printf("%lld\n",(lalr()%Mod+Mod)%Mod);
    return 0;
}