好久之前在 cmd's blog 看到過,這次做題遇上了,就學了一下,其實挺 easy 的。
眾所周知其實是我不會證
\(n\) 個點 \((x_i,y_i)\) 可以唯一確定乙個次數為 \(n-1\) 的多項式,拉格朗日插值給出了一種構造:
\[f(z)=\sum_^ \dfrac(z-x_j)}(x_i-x_j)}
\]首先提出常數部分:
\[a_i=\dfrac(x_i-x_j)}
\]可以 \(o(n^2)\) 搞出每乙個 \(a_i\)。
然後求乙個多項式 \(g(z)=\prod_^ (z-x_i)\)。
可以發現
\[f(z)=\sum_^a_i\dfrac
\]考慮如何快速搞出後面那個 \(\dfrac\)。
設 \(h(z)=\dfrac\)。
可以得到 \((z-c)h(z)=g(z)\)。兩邊提取係數得到
\[[z^]h-c[z^i]h=[z^i]g\\
[z^i]h=\dfrac]h}
\]遞推即可。
給出 模板題 通過**:
#includeusing namespace std;
#define fi first
#define se second
#define mkp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define sz(v) (int)v.size()
typedef long long ll;
typedef double db;
templatebool ckmax(t&x,t y)
#define rep(i,x,y) for(int i=x,i##end=y;i<=i##end;++i)
#define per(i,x,y) for(int i=x,i##end=y;i>=i##end;--i)
inline int read()
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f?x:-x;
}#define mod 998244353
inline int qpow(int n, int k)
vector lagrange(const vector &x, const vector &y)
b[0] = 1;
for(int i = 0; i < n; ++i)
for(int i = 0; i < n; ++i) else
for(int j = 0; j < n; ++j)
f[j] = (f[j] + 1ll * a[i] * c[j] % mod) % mod;
} return f;
}inline int calc(const vector &f, int x)
signed main()
拉格朗日插值
拉格朗日插值基函式 li x x x 0 x xi 1 x xi 1 x x n x i x0 xi xi 1 xi xi 1 xi xn 拉格朗日差值函式 ln x i 0 nyil i x 其中,x為缺失值對應的下表序號,ln x 為缺失值的插值結果,xi 為缺失值yi 的下表序號。對全部缺失值...
拉格朗日插值
function s larg1 x,y,xi m length x 求出插值節點向量長度 n length y if m n error 向量x與y的長度必須一致 這裡肯定一致,只是為了消除直接選取x,y資料的時候出錯而設定的 end s 0 for i 1 n z ones 1,length x...
拉格朗日插值
存在性和唯一性的證明以後再補。拉格朗日插值,emmmm,名字挺高階的 joy 它有什麼應用呢?我們在fft中講到過 設 n 1 次多項式為 y sum a i x i 有乙個顯然的結論 如果給定 n 個互不相同的點 x,y 則該 n 1 次多項式被唯一確定 那麼如果給定了這互不相同的 n 個點,利用...