The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest
B. Polynomial
Description
定义 f i = ∑ i = 0 n a i x i f_i=\sum_{i=0}^{n}a_ix^{i} fi=∑i=0naixi,然后给定 f 0 f_{0} f0 ~ f n f_{n} fn,现在给出 m m m 次询问,每次询问给定 L L L 和 R R R,问你 ∑ i = L R f i \sum_{i=L}^{R}f_{i} ∑i=LRfi 是多少
Tutorial
拉格朗日插值裸题,正好复习一下
拉格朗日插值是用来对任意曲线进行多项式拟合的,假设现在给定某一曲线中的任意 n + 1 n + 1 n+1 个点 ( x i , y i ) (x_i,y_i) (xi,yi),那么我就可以使用拉格朗日插值求出该曲线的最高幂次为 n n n 近似多项式函数,其公式如下:
f ( k ) = ∑ i = 1 n y i ∏ j ≠ i k − x j x i − x j f(k)=\sum_{i=1}^{n}y_i\prod_{j \neq i}\frac{k-x_j}{x_i-x_j} f(k)=i=1∑nyij=i∏xi−xjk−xj
那么我们可以使用上式在 O ( n 2 ) O(n^2) O(n2) 的时间内求出该曲线内的任意一点的近似值
在本题中,显然 f i f_i fi 是一个最高幂次为 n n n 多项式函数,那么我们可以使用给定的 n + 1 n + 1 n+1 个点来求出任意一点的值
但是 O ( n 2 ) O(n^2) O(n2) 的时间显然不能满足我们的需求,考虑优化
可以发现题目中的 x x x 是连续的,即 x = 1 , 2 , 3 , . . . x = 1, 2, 3, ... x=1,2,3,...,那么上式可以写成:
f ( k ) = ∑ i = 1 n y i ∏ j ≠ i k − j i − j f(k)=\sum_{i=1}^{n}y_i\prod_{j \neq i}\frac{k-j}{i-j} f(k)=i=1∑nyij=i∏i−jk−j
发现乘积部分的分母其实可以写成阶乘形式,而分子也可以化简
f ( k ) = ∑ i = 1 n y i p r e i − 1 × s u f i + 1 f a c i × ( ± f a c n − i ) f(k)=\sum_{i=1}^{n}y_i\frac{pre_{i-1} \times suf_{i+1}}{fac_i \times (\pm fac_{n-i})} f(k)=i=1∑nyifac