模板題
給出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...