拉格朗日插值
例题 Luogu P4781【模板】拉格朗日插值
给出
方法 1:差分法¶
差分法适用于
如,用差分法求某三次多项式
第一行为
方法 2:待定系数法¶
设
如果您不知道什么是高斯消元,请看 高斯消元。
时间复杂度
方法 3:拉格朗日插值法¶
在 多项式部分简介 里我们已经定义了多项式除法。
那么我们会有:
这是显然的,因为
这样我们就可以列一个关于
我们根据中国剩余定理,有:
则
所以就有:
所以在模意义下
这就是拉格朗日插值的表达式。
如果要将每一项的系数都算出来,时间复杂度仍为
本题中,还需要求解逆元。如果先分别计算出分子和分母,再将分子乘进分母的逆元,累加进最后的答案,时间复杂度的瓶颈就不会在求逆元上,时间复杂度为
代码实现¶
#include <cstdio>
const int maxn = 2010;
using ll = long long;
ll mod = 998244353;
ll n, k, x[maxn], y[maxn], ans, s1, s2;
ll powmod(ll x, ll n) {
ll ret = 1ll;
while (n) {
if (n & 1) ret = ret * x % mod;
x = x * x % mod;
n >>= 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;
ans += s1 * inv(s2) % mod;
}
printf("%lld\n", (ans % mod + mod) % mod);
return 0;
}
buildLast update and/or translate time of this article,Check the history
editFound smelly bugs? Translation outdated? Wanna contribute with us? Edit this Page on Github
peopleContributor of this article Ir1d, Marcythm, YanWQ-monad, x4Cx58x54
translateTranslator of this article Visit the original article!
copyrightThe article is available under CC BY-SA 4.0 & SATA ; additional terms may apply.