对于n次多项式
Γ ( k ) = ∑ i = 0 n y i ∏ j = 0 , j ≠ i n k − x j x i − x j \Gamma(k) = \sum_{i=0}^{n}y_i\prod_{j=0,{j}\neq {i} }^{n}\frac{k-x_j}{x_i-x_j} Γ(k)=i=0∑nyij=0,j̸=i∏nxi−xjk−xj
const int mod=1e9+7;
template<class T>
T qpow(T x,int k){
T e=1;
while(k){
if(k&1)e=1ll*e*x%mod;
x=1ll*x*x%mod;
k>>=1;
}
return e;
}
template<class T>
T lagrange(int n,int x[],int y[],T k){
T ans=0;
for(int i=0;i<=n;++i){
T fz=1,fm=1;//分子分母
for(int j=0;j<=n;++j){
if(i==j)continue;
fm=1ll*fm*(x[i]-x[j])%mod;
fz=1ll*fz*(k-x[j])%mod;
}
ans=(1ll*ans+1ll*y[i]*fz%mod*qpow(fm,mod-2)%mod)%mod;
}
return (ans+mod)%mod;
}
在x取值连续时的做法
当 x i x_i xi 的取值都是连续的,可以把上面的算法优化到O(n)复杂度
首先把 x i x_i xi换成i,新的式子为
f ( k ) = ∑ i = 0 n y i ∏ i ̸ = j k − j i − j f ( k ) f(k) = \sum_{i=0}^{n} y_i \prod_{i \not = j} \frac{k - j}{i - j}f(k) f(k)=i=0∑nyii̸=j∏i−jk−jf(k)
对于 ∏ i ̸ = j n k − j i − j \prod_{i \not = j} ^{n}\frac{k - j}{i - j} ∏i̸=