拉格朗日插值法

2021-09-01 17:53:14 字數 1817 閱讀 3498

模板題

給出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)

第二種是高斯消元法,形如f(x

)=∑i

=1na

i×xi

f(x)=\sum_^na_i\times x^i

f(x)=∑

i=1n

​ai​

×xi將n

nn個x

ix_i

xi​代入得到n

nn個n

nn元一次方程高斯消元求解,複雜度o(n

3)

o(n^3)

o(n3)

第三種就是拉格朗日插值法

拉格朗日基本多項式為:

l i(

x)=∏

j=0,

j≠in

x−xj

xi−x

jl_i(x)=∏_^n\frac

li​(x)

=∏j=

0,j̸

​=in

​xi​

−xj​

x−xj

​​可以發現li(

xi)=

1l_i(x_i)=1

li​(xi

​)=1

,其餘都是0

00,那麼就可以構造出這個多項式:

f (x

)=∑i

=1ny

i×li

(x

)f(x)=\sum_^ny_i\times l_i(x)

f(x)=∑

i=1n

​yi​

×li​

(x),根據性質f(x

i)=y

if(x_i)=y_i

f(xi​)

=yi​

也就是經過了這n

nn個點,這樣用多項式乘除法就可以o(n

2)

o(n^2)

o(n2

)求出多項式係數,帶入求值也可以o(n

2)

o(n^2)

o(n2

),注意求值時不用每次乘逆元,只要先把分子分母分開算最後再乘一次就好了。

**如下:

#include

#include

#include

#include

#include

#define maxn 2005

#define ll long long

using

namespace std;

const

int mod=

998244353

;inline

intrd()

int n,k,x[maxn]

,y[maxn]

;ll ans;

inline

intqpow

(int x,

int k)

return ret%mod;

}int

main()

printf

("%lld\n"

,ans)

;return0;

}

拉格朗日插值法

拉格朗日插值法 拉格朗日插值法可以幫助我們解決以下的問題 已知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...

拉格朗日插值法

function p lagrange x,y p lagrange x,y 其中x和y是向量,p是返回的多項式向量 m獲取x的個數 m length x for k 1 1 m 表示乙個插值函式的起始值 v 1 for i 1 1 m if k i 注意 以後凡是在遇到乙個在數學上是 x 1 等包...

拉格朗日插值法

當 x 的取值不一定是 1 n 連續的時候,我們只能 o n 地插出結果 洛谷 p4781 include define ll long long using namespace std const int n 2e3 10 const int mod 998244353 int x n y n l...