拉格朗日插值求系数
我比较懒,记 \(f_i=[x^i]f(x)\)。
就是求 \(f(x)=\sum\limits_{i=1}^ny_i\prod\limits_{j\neq i}\frac{x-x_j}{x_i-x_j}\) 的系数。
设 \(a_i=\frac{y_i}{\prod\limits_{j\neq i}(x_i-x_j)}\),\(g(x)=\prod\limits_{i=1}^n(x-x_j)\),显然 \(f(x)=\sum\limits_{i=1}^n\frac{a_ig(x)}{x-x_i}\)。
考虑怎么 \(O(n)\) 求 \(h(x)=\frac{g(x)}{x-x_i}\) 的系数,即 \((x-x_i)h(x)=g(x)\).
- 首先有 \(h_n=0\)。
- 注意到 \(g_j=h_{j-1}-x_ih_j\),所以可以得到 \(h_{j-1}=g_j+x_ih_j\),递推即可。
最后全都加起来,时间复杂度 \(O(n^2)\)。
void lag(ll a[N]){
ll res[N]{};
ll s[N]{},t[N]{};
s[0]=1;
rep(i,0,n){
rep(j,0,n)t[j]=s[j],s[j]=0;
rep(j,0,n)Add(s[j],mul(t[j],dec(0,i))),Add(s[j+1],t[j]);
}
rep(i,0,n){
ll mm=1;
rep(j,0,n)if(i!=j)Mul(mm,dec(i,j));
Mul(a[i],qpow(mm,mod-2));
ll ss[N]{};
ss[n]=s[n+1];
per(j,n,1)ss[j-1]=dec(s[j],mul(ss[j],dec(0,i)));
rep(j,0,n)Add(res[j],mul(ss[j],a[i]));
}
rep(i,0,n)a[i]=res[i];
}

浙公网安备 33010602011771号