拉格朗日插值


拉格朗日插值

很久很久以前,有一個人叫拉格朗日,他發現了拉格朗日插值,可以求出給出函數 \(f(x)\)\(n+1\) 個點,求出這個函數 \(f(x)\) 的值。

推論:

根據某些定理可知:
\(f(x)\equiv f(a)\bmod(x-a)\)

那么我們就可以把這個 \(n+1\) 個點的式子全部列出來。最終為

\(f(x)\equiv f(x_1)\bmod(x-x_1)\)

計算:

我們可以發現,這個式子特別類似於中國剩余定理的式子,那么根據中國剩余定理,我們可以設:

\(M=\prod_{i=1}^n{(x-x_i)},m[i]=\frac{M}{x-x_i}\)

繼續,得到 \(m[i]\) 的逆元是 \(m[i]^{-1}=\prod_{j!=i} \frac{1}{x_i-x_j}\)

所以,最后中國剩余定理的值是:

\(f(x)=\sum_{i=1}^n y_im_im_i^{-1}\equiv \sum_{i=1}^n y_i \prod_{i!=j} \frac{x-x_j}{x_i-x_j}\)

因此,只要直接套到這個公式里就行了。

例題:

洛谷P4781

模板,直接上代碼:(不會真有人不會算逆元吧(是我啊(那沒事了)))

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll n,k,x[2005],y[2005],ans,s1,s2;
ll qmi(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1) res=res*a%mod;
        b>>=1;
        a=a*a%mod;
    } 
    return res%mod;
}
ll inv(ll x){return qmi(x,mod-2);}
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        scanf("%lld%lld",&x[i],&y[i]);
    for(int i=1;i<=n;i++){
        s1=y[i]%mod;
        s2=1ll;
        for(int j=1;j<=n;j++)
            if(i!=j){
                s1=s1*(k-x[j])%mod;
                s2=s2*(x[i]-x[j])%mod;
            }
                
        ans+=s1*inv(s2)%mod;
    }
    cout<<(ans%mod+mod)%mod<<endl;
    system("pause");
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM