「笔记」拉格朗日插值
例题:【模板】拉格朗日插值
给你 个点 ,将过这 个点的最多 次的多项式记为 ,求 的值。
- 方法 1:待定系数法
设 ,将每个 代入 ,有 ,这样就可以得到由 个 元一次方程所组成的方程组,然后使用 高斯消元 解该方程组的每一项 ,就得到了 的表达式。
时间复杂度 。
- 方法 2:拉格朗日插值法
题目要求构造一个函数 过所有点 。设第 个点在 轴上的投影为 。
考虑构造 个函数 ,使得对于第 个函数 ,其图像过 ,则可知题目所求函数 。
那么可以设 ,将点 代入可以知道 ,所以
那么我们就可以从另外一个角度推导出通常意义下(而非模意义下)拉格朗日插值的式子为:
#include<bits/stdc++.h>
#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 s = 0, f = 0;
char ch = getchar();
while(!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while(isdigit(ch)) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return f ? -s : s;
}
int Pow(int x, int p) {
int res = 1;
while(p) {
if(p & 1) res = res * x % mod;
x = x * x % mod, p >>= 1;
}
return res;
}
int Inv(int x) { return Pow(x, mod - 2); }
signed main() {
n = read(), K = read();
for(int i = 1; i <= n; ++i) {
x[i] = read(), y[i] = read();
}
for(int i = 1; i <= n; ++i) {
int fz = 1, fm = 1;
for(int j = 1; j <= n; ++j) {
if(i == j) continue;
fz = fz * (K - x[j]) % mod;
fm = fm * (x[i] - x[j]) % mod;
}
ans = (ans + y[i] * fz % mod * Inv(fm) % mod) % mod;
}
ans = (ans + mod) % mod;
printf("%lld\n", ans);
return 0;
}
另一个例题:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-01-07 About me