lagrange 插值法模板
阿新 • • 發佈:2020-12-16
對於n次多項式
\[\Gamma(k) = \sum_{i=0}^{n}y_i\prod_{j=0,{j}\neq {i} }^{n}\frac{k-x_j}{x_i-x_j} \]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\) 的取值都是連續的,可以把上面的演算法優化到O(n)複雜度
首先把\(x_i\)換成i,新的式子為
對於 \(\prod_{i \not = j} ^{n}\frac{k - j}{i - j}\) 可以優化
對於分子來說,我們維護出關於k的字首積和字尾積,也就是
對於分母來說,觀察發現這其實就是階乘的形式,我們用fac[i]來表示 \(i!\)
那麼式子就變成