例題:【模板】拉格朗日插值
給你 \(n\) 個點 \((x_i, y_i)\),將過這 \(n\) 個點的最多 \(n-1\) 次的多項式記為 \(f(x)\),求 \(f(k)\) 的值。設 \(f(x) = \displaystyle\sum_^a_x x^i\) ,將每個 \(x_i\) 代入 \(f(x)\),有 \(f(x_i) = y_i\),這樣就可以得到由 \(n\) 個 \(n\) 元一次方程所組成的方程組,然後使用高斯消元解該方程組的每一項 \(a_i\),就得到了 \(f(x)\) 的表示式。
時間複雜度 \(\mathcal o(n^3)\)。
題目要求構造乙個函式 \(f(x)\) 過所有點 \(p_i(x_i, y_i)\)。設第 \(i\) 個點在 \(x\) 軸上的投影為 \(p_i^(x_i, 0)\)。
考慮構造 \(n\) 個函式 \(f_1(x),f_2(x),...,f_n(x)\),使得對於第 \(i\) 個函式 \(f_i(x)\) ,其影象過 \(\beginp_j^(x_j, 0),(j \not = i) \\ p_i(x_i, y_i) \end\),則可知題目所求函式 \(f(x) = \displaystyle\sum_^ f_i(x)\)。
那麼可以設 \(f_i(x) = a \times \prod_(x - x_j)\),將點 \(p_i(x_i, y_i)\) 代入可以知道 \(a = \frac (x - x_j)}\),所以
\[f_i(x) = y_i \times \frac(x - x_j)}(x_i - x_j)} = y_i \times \prod_ \frac
\]那麼我們就可以從另外乙個角度推導出通常意義下(而非模意義下)拉格朗日插值的式子為:
\[f(x) = \sum_^ y_i \times \prod_ \frac
\]
#include#define int long long
using namespace std;
const int mod = 998244353;
const int maxn = 1e5 + 10;
int n, k, ans = 0;
int x[maxn], y[maxn];
int read()
int pow(int x, int p)
return res;
}int inv(int x)
signed main()
for(int i = 1; i <= n; ++i)
ans = (ans + y[i] * fz % mod * inv(fm) % mod) % mod;
}ans = (ans + mod) % mod;
printf("%lld\n", ans);
return 0;
}
另乙個例題:
atcoder abc208 f - cumulative sum
題解
筆記 拉格朗日插值
是個好東西。顯然 n 1 個點值可以唯一的確定乙個 n 次多項式。那麼根據多項式求點值的過程叫求值。根據多項式點值來求多項式其他點值就是插值了。那麼現在上拉格朗日插值。他解決的問題是 對於給定的 n 1 個點值求出其他點在這個 n 次多項式的值。我們嘗試構造多項式 f x 來滿足 n 1 個點值。我...
拉格朗日插值的優缺點 筆記 拉格朗日插值
簡介 對於 k 次多項式函式 f x 若已知 k 1 個點值,則可構造出多項式。有 f x sum y i prod dfrac 正確性詳見 拉格朗日插值。正確性將 k 1 個點值代入即可檢驗。當 x x k 時,對 i 進行討論 當 i not 時,存在乙個 j 滿足 j k 對於乘積項的分子 p...
拉格朗日插值
拉格朗日插值基函式 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 的下表序號。對全部缺失值...