多项式
单纯记录一下
-
拉格朗日插值
大佬博客链接f ( k ) = ∑ i = 0 n y i ∏ i ≠ j k − x [ j ] x [ i ] − x [ j ] f(k) = \sum_{i = 0}^{n} y_i \prod_{i \not = j} \frac{k - x[j]}{x[i] - x[j]} f(k)=i=0∑nyii=j∏x[i]−x[j]k−x[j]
普通拉格朗日插值代码如下
ll x[maxn],y[maxn];
ll solve(int n,ll k)
{
ll ans=0;
for(int i=1;i<=n;i++)
{
ll tmp1=y[i],tmp2=1;
for(int j=1;j<=n;j++)
{
if(i==j) continue;
tmp1=tmp1*((k-x[j])%mod)%mod;
tmp1=(tmp1+mod)%mod;
tmp2=tmp2*(x[i]-x[j])%mod;
tmp2=(tmp2+mod)%mod;
}
ans=ans+tmp1*qpow(tmp2,mod-2,mod)%mod;
ans%=mod;
}
return ans;
}
已做题目洛谷p4593,用到了如下知识点
1
k
+
2
k
+
3
k
.
.
.
+
n
k
1^{k}+2^k+3^k...+n^k
1k+2k+3k...+nk可以写为一个k+1次多项式。
重心拉格朗日插值
f
(
k
)
=
∑
i
=
1
n
y
i
∏
i
≠
j
k
−
x
[
j
]
x
[
i
]
−
x
[
j
]
f(k) = \sum_{i = 1}^{n} y_i \prod_{i \not= j} \frac{k - x[j]}{x[i] - x[j]}
f(k)=i=1∑nyii=j∏x[i]−x[j]k−x[j]
令
g
=
∏
i
=
1
n
k
−
x
[
i
]
g=\prod_{i =1}^{n}{k-x[i]}
g=∏i=1nk−x[i]
f
(
k
)
=
g
∑
i
=
1
n
1
(
k
−
x
[
i
]
)
∏
i
≠
j
y
i
(
x
[
i
]
−
x
[
j
]
)
f(k) = g\sum_{i = 1}^{n}\frac{1}{(k-x[i])} \prod_{i \not = j} \frac{y_i}{(x[i] - x[j])}
f(k)=gi=1∑n(k−x[i])1i=j∏(x[i]−x[j])yi
令
t
=
∏
i
≠
j
y
i
(
x
[
i
]
−
x
[
j
]
)
t=\prod_{i \not = j} \frac{y_i}{(x[i] - x[j])}
t=∏i=j(x[i]−x[j])yi
f
(
k
)
=
g
∑
i
=
1
n
t
i
k
−
x
[
i
]
f(k)=g\sum_{i=1}^{n}\frac{t_{i}}{k-x[i]}
f(k)=gi=1∑nk−x[i]ti
这样新加入的点只需计算t即可。
2. 待续