拉格朗日插值
最初的拉插
重心拉格朗日插值
记 \(g(x) = \prod\limits_{i=1}^n x - x_i, h(i) = \prod\limits_{j\neq i}{x_i - x_j}\),则
计算 \(h(i),g(x)\) 即可 \(\mathrm{O(n)}\) 求 \(f(x)\)。
例:\(\texttt{CF1155E Guess the Root}\)
优化 dp
例 1: \(\texttt{ABC208F Cumulative Sum}\)
考虑每个 \(i^k\) 对答案的贡献,则有:
\(ans = \sum\limits_{i=1}^n i^k\dbinom{n-i+m-1}{m-1} = \dfrac 1 {(m-1)!}\sum\limits_{i=1}^n i^k \dfrac{(n-i+m-1)!}{(n-i)!}\)
\(i^k\) 是关于 \(i\) 的 \(k\) 次多项式,\((n-i+m-1)!\) 是关于 \(i\) 的 \(n+m-1\) 次多项式,\((n-i)!\) 是关于 \(i\) 的 \(n\) 次多项式,则答案为关于 \(i\) 的 \(k+m\) 次多项式,直接取 \(i \in [1,k+m+1]\) 的 \(f(i,m)\) 做拉格朗日插值即可,时间复杂度 \(\mathrm{O(km)}\) 。
例 2: \(\texttt{[集训队互测 2012] calc}\)
只考虑上升序列的权值,暴力 \(dp\),记 \(dp(i,j)\) 表示前 \(i\) 个数的权值 \(\in [1,j]\) 的权值和,则有转移:
这可以看作是一个多项式 \(f_i(j)\) ,设 \(f_i(j)\) 的次数为 \(g(i)\),
由 \(f_i(j) - f_i(j-1) = f_{i-1}(j-1) * j\) 可知 \(g(i) - 1 = g(i - 1) + 1\)
由此得到 \(g(i) = g(i - 1) + 2\),由 \(g(0) = 0\) 知答案 \(dp(n,k)\) 为关于 \(k\) 的 \(2n\) 次多项式,直接取 \(2n+1\) 个点拉格朗日插值即可,时间复杂度 \(\mathrm{O(n^2)}\)。