lagrange 插值做题记录
tyvj 1858 XLkxc - 黑暗爆炸 3453 - Virtual Judge
序列求和 V5 - 51Nod 1822 - Virtual Judge
线性插值的伪代码
不妨设要插值的多项式为 \(f\).
- 长为 \(L\) 的数组 \(Y,\text{ifac}\) 中,\(Y[i]\) 记录 \(f(i)\),\(\text{ifac}[i]\) 记录 \(\displaystyle \frac{1}{i!}\).
- 函数 \(\text{calc}(x)\)
- 如果 \(x\leq L\) 则
- 返回 \(Y[x]\)
- 声明长为 \(L\) 的数组 \(\text{pre},\text{suf}\)
- 特别的,\(\text{pre}[0]\gets 1\)
- 让 \(i\) 遍历 \((1,2,\dots,L)\)
- \(\text{pre}[i]\gets (x-i)\times\text{pre}[i-1]\)
- 特别的,\(\text{suf}[L+1]\gets 1\)
- 让 \(i\) 遍历 \((L,L-1,\dots,1)\)
- \(\text{suf}[i]\gets(x-i)\times\text{suf}[i+1]\)
- 声明变量 \(\text{ans}\gets 0\)
- 让 \(i\) 遍历 \((1,2,\dots,L)\)
- 声明变量 \(\text{tmp}\gets Y[i]\times\text{ifac}[i-1]\times\text{ifac}[L-i]\times\text{pre}[i-1]\times\text{suf}[i+1]\)
- 如果 \(i\) 为奇数,则
- \(\text{ans}\gets\text{ans}-\text{tmp}\)
- 否则
- \(\text{ans}\gets\text{ans}+\text{tmp}\)
- 返回 \(\text{ans}\)
- 如果 \(x\leq L\) 则
calc
集训队互测的题。
首先,令 \(a\) 升序,这样,算出答案后乘 \(n!\) 即可。
设 \(f_{i,j}\) 表示长为 \(i\) 的 \(a\) 序列,值域为 \([1,j]\),则答案为多少。则有转移
然后,不妨设 \(f_i(j)=f_{i,j}\),现在设法证明 \(f_i\) 是多项式。
容易发现,转移可以变形为
这就说明 \(f_i\) 是多项式。
设 \(f_i\) 为 \(g_i\) 次多项式,则有
故
于是就可以插值了。
注意:差分之后产生了额外的次数差!
The Sum of the k-th Powers
板子。
Submission #301678375 - Codeforces
The Sum of the k-th Powers - 洛谷
答案为
实际上,\(f\) 是多项式。证明可以考虑累加法。
为了线性做出这道题,要注意到
是积性函数,所以,可以用欧拉筛求出 \(i\in [k+1]\) 的 \(i^k\) 值,复杂度 \(O(k+\pi(k)\log k)=O(k)\)。
然后,lagrange 插值求 \(f(n)\) 容易做到线性。
最终复杂度 \(O(k)\)。
tyvj 1858 XLkxc
纯纯插值题。
tyvj 1858 XLkxc - 黑暗爆炸 3453 - Virtual Judge
这是一个 \(O(k^2)\) 的 lagrange 插值做法。
非常经典的,
中 \(f\) 是 \(k+1\) 次多项式。所以,可以 \(O(k)\) lagrange 插值求出 \(f\)。
\(g\) 的定义为
所以
变形得 \(f(x)=g(x)-g(x-1)\),说明 \(g(x)-g(x-1)\) 是关于 \(x\) 的 \(k+1\) 次多项式,所以 \(g\) 是 \(k+2\) 次多项式。
设函数 \(h\) 为(其中 \(a\) 和 \(d\) 为题目中所给出的)
同理可得 \(h\) 为 \(k+3\) 次多项式。为了求出 \(h(n+1)\)(就是答案),我们要先求出
其中的每个都可以 \(O(k)\) 查询函数 \(g\) 得到,这部分复杂度为 \(O(k^2)\)。有了它们,我们就可以插值出函数 \(h\),就可以 \(O(k)\) 求得 \(h(n+1)\) 了。
时间复杂度 \(O(k^2)\)。
Cowmpany Cowmpensation
这题还有离散化相关计数 + 容斥做法。
Submission #301728957 - Codeforces
容斥做法 题解 CF995F 【Cowmpany Cowmpensation】 - 洛谷专栏
设 \(f[u][m]\) 表示仅考虑点 \(u\) 所在子树,点值域为 \([1,m]\) 时的答案。
转移为
发现 \(f[u][m]\) 为关于 \(m\) 的 \(n\) 次多项式,所以 lagrange 插值可做到 \(O(n^2)\)。

浙公网安备 33010602011771号