lagrange 插值做题记录

插值在OI中的应用 - Grice - 博客园

lagrange 插值笔记 - 洛谷专栏

P5850 calc加强版 - 洛谷

Problem - F - Codeforces

2025oifc2025.01.03 - 信友队

tyvj 1858 XLkxc - 黑暗爆炸 3453 - Virtual Judge

序列求和 V5 - 51Nod 1822 - Virtual Judge

Cowmpany Cowmpensation - 洛谷

Stranger Trees - 洛谷

Forest Fires - 洛谷

线性插值的伪代码

不妨设要插值的多项式为 \(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}\)

calc

集训队互测的题。

P4463 [集训队互测 2012] calc - 洛谷

记录详情 - 洛谷

首先,令 \(a\) 升序,这样,算出答案后乘 \(n!\) 即可。

\(f_{i,j}\) 表示长为 \(i\)\(a\) 序列,值域为 \([1,j]\),则答案为多少。则有转移

\[f_{i,j}=f_{i-1,j-1}\times j+f_{i,j-1} \]

然后,不妨设 \(f_i(j)=f_{i,j}\),现在设法证明 \(f_i\) 是多项式。

容易发现,转移可以变形为

\[f_i(j)-f_i(j-1)=jf_{i-1}(j-1) \]

这就说明 \(f_i\) 是多项式。

\(f_i\)\(g_i\) 次多项式,则有

\[g_{i}-1=g_{i-1}+1 \]

\[g_n=2n \]

于是就可以插值了。

注意:差分之后产生了额外的次数差!

The Sum of the k-th Powers

板子。

Problem - F - Codeforces

Submission #301678375 - Codeforces

The Sum of the k-th Powers - 洛谷

答案为

\[f(n)=\sum_{i=1}^ni^k \]

实际上,\(f\)多项式。证明可以考虑累加法

为了线性做出这道题,要注意到

\[g(i)=i^k \]

积性函数,所以,可以用欧拉筛求出 \(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

Source code - Virtual Judge

这是一个 \(O(k^2)\)lagrange 插值做法。

非常经典的,

\[f(i)=1^k+2^k+\cdots+i^k \]

\(f\)\(k+1\)多项式。所以,可以 \(O(k)\) lagrange 插值求出 \(f\)

\(g\) 的定义为

\[g(x)=\sum_{i=1}^xf(i) \]

所以

\[g(x)=g(x-1)+f(x) \]

变形得 \(f(x)=g(x)-g(x-1)\),说明 \(g(x)-g(x-1)\) 是关于 \(x\)\(k+1\) 次多项式,所以 \(g\)\(k+2\) 次多项式。

设函数 \(h\) 为(其中 \(a\)\(d\) 为题目中所给出的)

\[h(x)=\sum_{i=1}^xg(a+(i-1)d) \]

同理可得 \(h\)\(k+3\) 次多项式。为了求出 \(h(n+1)\)(就是答案),我们要先求出

\[h(1),h(2),\dots,h(k+4) \]

其中的每个都可以 \(O(k)\) 查询函数 \(g\) 得到,这部分复杂度为 \(O(k^2)\)。有了它们,我们就可以插值出函数 \(h\),就可以 \(O(k)\) 求得 \(h(n+1)\) 了。

时间复杂度 \(O(k^2)\)

Cowmpany Cowmpensation

这题还有离散化相关计数 + 容斥做法。

Problem - 995F - Codeforces

Submission #301728957 - Codeforces

Cowmpany Cowmpensation - 洛谷

容斥做法 题解 CF995F 【Cowmpany Cowmpensation】 - 洛谷专栏

\(f[u][m]\) 表示仅考虑点 \(u\) 所在子树,点值域为 \([1,m]\) 时的答案。

转移为

\[f[u][j]=f[u][j-1]+\prod_{v \ \text{son of}\ u} f[v][j] \]

发现 \(f[u][m]\) 为关于 \(m\)\(n\) 次多项式,所以 lagrange 插值可做到 \(O(n^2)\)

posted @ 2025-01-20 07:57  zhiyin123123  阅读(23)  评论(0)    收藏  举报
目录侧边栏

qwq