給你\(n + 1\)個點\((x,y)\),希望你求出過這幾個點的\(n-1\)次多項式。
樸素的想法是把該多項式每一項的係數作為未知數,然後把點代入多項式中求出很多個\(n\)元\(1\)次方程組。然後高斯消元,時間複雜度為\(o(n^3)\)
我們要介紹的拉格朗日插值法本質上來說是一種構造法,而不是去根據點對來想辦法求解。
思考:對於當前給出的\(n+1\)個點,若給你乙個多項式\(f_i(x)\),該多項式滿足當你代入\(x_i\)時,\(f_i(x)=y_i\),否則,\(f_i(x)=0\),那麼我們是不是只要把這\(n+1\)個多項式相加起來就可以求出我們想要求的多項式了。
知道了這點後,我們開始構造這\(n+1\)個多項式,具體的,我們構造出的第\(i\)個多項式長的樣子像這樣:
\(f_i(x) = y_i\prod_\frac\)
構造思想即是希望當你代入任何乙個\(x_j\neq x_i\)時,該多項式的某一因式為\(0\),當你代入\(x_i\)時,該多項式可分解為\(y_i*1\)。上述的多項式便由此得來。
然後,我們要求的總的多項式\(f(x)=\sum_^y_i\prod_\frac\)。
你可以把它拆開來求出每一項的係數,總時間複雜度為\(o(n^2)\)。
模板題,已知\(x\)個點,再給你乙個\(k\),求\(x-1\)次多項式的某一點的值\(f(k)\)
#include #include #include #include #include #define maxn 30005
#define mod 998244353
long long co[maxn],xi[maxn],yi[maxn],n,k,ans = 0;
long long qpow(long long x,long long y)
return now;
}int main()
for (int j = 1;j <= n;j++)
(ans += num * qpow(num1,mod - 2) % mod) %= mod;
} printf("%lld\n",ans);
return 0;
}
插值法(拉格朗日插值和牛頓插值)
牛頓插值 defnewton interpolation x,y,init sum y 0 temp np.zeros len x len x 將第一行賦值 for i in range 0,len x temp i,0 y i temp sum 1.0 for i in range 1,len x...
拉格朗日插值法
拉格朗日插值法 拉格朗日插值法可以幫助我們解決以下的問題 已知x取值0,1,1,2時,f取值2,2,0,6 求x 3時f的值。示例1 intxs intys f 3 intval lagrangepolynomial 3,xs,ys staticint lagrangepolynomial intx...
拉格朗日插值法
模板題 給出n nn個點 xi yi x i,y i xi y i 讓你確定這個n 1 n 1n 1次方程並代入求值 這個有三種求法 第一種是差分法,只適用於xi ix i i xi i的情況,就是不斷做差分直到序列變成乙個定值就可以求出所有項的係數,複雜度o n 2 o n 2 o n2 第二種是...