拉格朗日插值学习笔记
# 前言
学FFT的时候碰到了这个神奇的东西,于是记录一下。
# 拉格朗日插值法
可知由个不同坐标的点可以为以确定一个最高次数为的多项式。
那么给定这对应的个点,并求
拉格朗日插值法可以在复杂度内解决问题(当然也可以用高斯消元解决)
# 模板题 洛谷 P4781
给定,求,结果对取余
假设任意两个都不相同,那么应用拉格朗日插值公式得到的插值多项式为:
其中为拉格朗日基本多项式,表达式为
其特点是在上取值为1,其他点上取值为0
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e3 + 1000;
const ll mod = 998244353;
ll n, k;
ll x[maxn], y[maxn];
ll inv(ll val){
ll ret = 1, t = mod-2;
while(t){
if(t & 1) ret = ret * val % mod;
t >>= 1;
val = val * val % mod;
}
return ret;
}
signed main(){
cin >> n >> k;
for(int i=0; i<n; i++) cin >> x[i] >> y[i];
ll ans = 0, t1, t2;
for(int i=0; i<n; i++){
t1 = t2 = 1;
for(int j=0; j<n; j++){
if(j == i) continue;
t1 = t1 * ((x[i] - x[j] + mod) % mod) % mod;
t2 = t2 * ((k - x[j] + mod) % mod) % mod;
}
ans += y[i] * t2 % mod * inv(t1) % mod;
ans %= mod;
}
cout << ans << '\n';
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 重心拉格朗日插值法
可以发现,每当我们添加一个新点,在上述方法中就得完全重新计算。
下面是拉格朗日插值法的一种改进。
令
则
定义重心权
则
拉格朗日插值多项式变为
每当插入一个点,则只需对每个除以即可得到新的重心权
重新计算的复杂度为
# 参考资料
上次更新: 2021/02/24, 03:37:30