當給出了n個點的座標,求經過這 n 個點的多項式,以及某個點的點值,可以在 o(n^2) 的時間內求出,而樸素的高斯消元需要o(n^3)
給出我們對於每乙個 i,構造乙個多項式
發現,把 xi 帶進去時,函式值是 yi, 而將其他的x帶進去時,函式值都是0
於是我們把每個 i 的 li(x)相加,就是最後的多項式了
當要求 n 的函式值時,帶進去就可以 n^2 做了
ll lagrange(ll k)
}ans = add(ans, mul(y[i], mul(s1, power(s2, mod-2))));
} return ans;
}
如果x是連續的話,可以優化到o(n)
也就是求出 所有(n - xj) 的積,然後不要的那項求乙個逆元
分母是 (k-i)! *(i-1)!,要注意一下符號問題
ll lagrange(ll n, ll k) return ans;
}
經典應用首先講乙個經典應用:計算
老祖宗告訴我們,這個東西是個以n為自變數的k + 1次多項式
然後直接帶入k+1個點後用拉格朗日插值算即可,複雜度o(k)
也就是說,只要能判斷要求的是乙個多項式, 我們就可以用拉格朗日來插
最後放兩道道模板題 p4593 [tjoi2018]教科書般的褻瀆
這道題主要就是求
#include#define n 100
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll a[n], f[n], fac[n]; int t;
ll add(ll a, ll b)
ll mul(ll a, ll b)
ll dec(ll a, ll b)
ll power(ll a, ll b) return ans;
}ll lagrange(ll n, ll k) return ans; }
int main() printf("%lld\n", (ans % mod + mod) % mod);
} return 0;
}
[tyvj1858] xlkxc
求首先 求
可以知道 f 是k+1項的多項式, g差分一下就是 f, 所以 g 是 k+2 項的多項式, f是k+3項的多項式
於是把 f的k+4項用 g 插出來, 然後暴力插 f的 第n項
#include#define n 200
using namespace std;
typedef long long ll;
const ll mod = 1234567891;
int t, k, a, n, d;
ll f[n], g[n], fac[n];
ll add(ll a, ll b)
ll mul(ll a, ll b)
ll power(ll a, ll b) return ans;
}ll lagrange(ll *a, ll k, ll n) return ans;
}int main() return 0;
}
筆記 拉格朗日插值
是個好東西。顯然 n 1 個點值可以唯一的確定乙個 n 次多項式。那麼根據多項式求點值的過程叫求值。根據多項式點值來求多項式其他點值就是插值了。那麼現在上拉格朗日插值。他解決的問題是 對於給定的 n 1 個點值求出其他點在這個 n 次多項式的值。我們嘗試構造多項式 f x 來滿足 n 1 個點值。我...
筆記 拉格朗日插值
例題 模板 拉格朗日插值 給你 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 元一次方程所組成的方程...
拉格朗日插值的優缺點 筆記 拉格朗日插值
簡介 對於 k 次多項式函式 f x 若已知 k 1 個點值,則可構造出多項式。有 f x sum y i prod dfrac 正確性詳見 拉格朗日插值。正確性將 k 1 個點值代入即可檢驗。當 x x k 時,對 i 進行討論 當 i not 時,存在乙個 j 滿足 j k 對於乘積項的分子 p...