拉格朗日插值
题目大意
给出
方法 1:差分法
差分法适用于
如,用差分法求
1 5 14 30 55 91
4 9 16 25 36
5 7 9 11
2 2 2
第一行为
方法 2:高斯消元
使用 待定系数法 。设
如果您不知道什么是高斯消元,请看 Luogu P3389 高斯消元法 。
时间复杂度
方法 3:拉格朗日插值法
考虑将每个点做一个对于
如上图所示,黑线等于蓝线加绿线加红线。每次我们选择
最后将所有的
公式整理得:
如果要将每一项都算出来,时间复杂度仍是
本题中,还需要求解逆元。如果先分别计算出分子和分母,再将分子乘进分母的逆元,累加进最后的答案,时间复杂度的瓶颈就不会在求逆元上,时间复杂度为
代码实现
#include <algorithm>
#include <cstdio>
#include <cstring>
const int maxn = 2010;
using ll = long long;
ll mod = 998244353;
ll n, k, x[maxn], y[maxn], ans, s1, s2;
ll powmod(ll a, ll x) {
ll ret = 1ll, nww = a;
while (x) {
if (x & 1) ret = ret * nww % mod;
nww = nww * nww % mod;
x >>= 1;
}
return ret;
}
ll inv(ll x) { return powmod(x, mod - 2); }
int main() {
scanf("%lld%lld", &n, &k);
for (int i = 1; i <= n; i++) scanf("%lld%lld", x + i, y + i);
for (int i = 1; i <= n; i++) {
s1 = y[i] % mod;
s2 = 1ll;
for (int j = 1; j <= n; j++)
if (i != j)
s1 = s1 * (k - x[j]) % mod, s2 = s2 * ((x[i] - x[j] % mod) % mod) % mod;
ans += s1 * inv(s2) % mod;
ans = (ans + mod) % mod;
}
printf("%lld\n", ans);
return 0;
}
贡献者:@Ir1d@TrisolarisHD@YanWQ-monad
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用