计数中我目前只见过两类与多项式相关的问题,一类是采用 gf 来刻画,一类是用拉插来优化掉 dp 的很大一个维度,还有一类就是神秘多项式问题,但是考虑 fft 已经被 cnoi 除名了所以我就不学了(
这部分写的非常浅显,我本身的多项式水平是负数,如果大家有题目推荐欢迎狠狠地踹主包的说。
拉格朗日插值法
想到一个很有意思的事情,我第一次见到拉格朗日插值法被名字吓跑了,后来有一天看到老高中数学课本,看到 CRT 居然有用拉格朗日插值法的理解,然后就去写板子了。
基本形式
给定 \(n\) 个点 \((x_1, y_1)\sim (x_n, y_n)\),求一个 $(n - 1) $ 次经过所有点的多项式中 \(x = k\) 的函数值。
无脑的做法是高斯消元求解系数。
但是注意到我们并不在乎系数只在乎求值。因此有:
感性认知一下:我们给每个 \(y\) 配上一个系数,对于 \(x_i\) 那么 \(y_i\) 系数为 \(1\),否则为 \(0\)。因此将 \(x_i\) 带入进来的时候我们希望首先 \(j\not= i\),其次总是有分子分母相等,同样的如果 \(x_i\) 与这一项不相等那么就等于 \(0\)。得到系数 \(\prod\limits_{j \not = i}\dfrac{k - x_j}{x_i - x_j}\)。
拓展
值域连续时
若 \(x_i\) 的值域连续时,以 \(x_i\) 为 \(1\sim n\) 为例,此时:
必须注意的是,\(k\le n\) 时,\((k - 1)^{\underline{n}}\) 可能等于 \(0\) 要特判!
预处理一些阶乘即可。
重心拉格朗日插值
有的时候我们要对单点 \(k\) 求取值,但是点会不断增加。
变换式子:
那么令 \(t_i = \prod\limits_{j \not= i}\dfrac{y_i}{x_j - x_i}\),新加入一个点只需要对所有 \(t_i\) 进行更新,计算新的 \(t_n\),\(w\),最后计算贡献。加入一个点的代价是 \(O(n)\) 的。
例题
AT_abc208_f
关键是要注意到组合数也可以看作是多项式,后面忘了
题解 https://www.luogu.com.cn/article/95bxguv3
P8290
我被卡常了。
首先考虑暴力,最大值与最小值的差很难做,考虑钦定范围在 \([L, R]\) 内其中 \(R - L = k\)。这样会算重,常见的套路是钦定端点被选择,比如这里我们再减去 \([L+1, R]\) 的情况即可。那么每个点能选择的就是 \([l_i, r_i]\cap [L, R]\) 这个区间。第一问直接 dp,第二问要做一个换根,对于一个区间可以 \(O(n)\) 求。最终时间复杂度是 \(O(nV)\) 的。现在考虑优化。首先如果我们将 \(l_i - 1, l_i, r_i, r_i+1\) 这些可能的端点离散化,那么两个端点之间的情况显然是相同的,要么然完全包含,要么然是与 \(l_i, r_i\) 形成一次函数,总共乘起来是 \((n+1)\) 次的函数,最后再做前缀和就是 \((n+2)\) 次函数,要枚举前 \((n+3)\) 项算前缀和。拉差即可,时间复杂度 \(O(n^3)\)。
P3270
当时应该是省选之前和 yzy 一起看的这题,我俩当时怎么都不会啊,暴力都不会。
为了方便下问认为 \(n \gets n - 1, R_i = n - R_i + 1\)。
注意到直接约束“恰好 \(K\) 个人全部科目小于等于 B 的”很难做,所以考虑容斥,钦定有 \(x\) 个人被吊打了就很容易了。这是一个明显的二项式反演的形式,\(g(x)\) 为钦定 \(x\) 个人被碾压了,那么就有:
瓶颈在于快速计算 \(\sum\limits_{t=1}^{U_i}t^{R_i}(U_i - t)^{n - R_i}\),拉插即可。
生成函数相关
形式幂级数也是幂级哈!
利用形式幂级数分析问题,而不是使用多项式科技
P5333
这也太难了
不会,我学。
首先考虑刻画哈密尔顿回路,通过手玩不难发现,本质上是将这些树分别剖成若干条不交链,哈密尔顿回路可以看作这些链的拼接,要求:
- 相邻的两条链来自不同树。
- 第一条链必须来自第一棵树,并且必须包含 \(1\) 点。
- 最后一条链必须不来自第一棵树。
假设已经钦定了链的剖分方式,如果一条链大小大于 \(1\) 那么产生 \(2\) 方案,否则只产生 \(1\) 方案。设 \(f[i, j]\) 代表第 \(i\) 棵树剖分成 \(j\) 条链的权和,若钦定了 \(j_1, j_2, \dots, j_m\),那么总权和就是 \(\prod_{i = 1}^n f[i, j_i]\)。那么只需要计算链的排列方式。
首先考虑第一条约束。
考虑容斥。独立考虑一棵树的影响,对于树 \(i\),剖分成 \(j\) 条链,钦定其中有 \(k\) 个位置最后相邻,容斥系数则为 \((-1)^k\),排列一共应当由 \(j!\binom{j - 1}{k}\) 中选择方法。于是我们得到了新的 \(x^{j - k}\) 条链。最后我们是按照这个 \((j - k)\) 之和相关计算答案的,不难想到构造出 egf:
如果没有别的约束,将 \(G_i\) 全部相乘计算每一项系数即可。
对于第二条约束,强制第一条链,注意,链内部只要将 \(j!\) 改成 \((j - 1!)!\) 代表第一条链固定,即可,合并链的形式幂级数则要去掉这条链。即 \(G_1\) 变成:
即可。
对于第三条约束,我们正难则反,减去不合法,即对于第一棵树强制第一条链和最后一条链。注意,最后一条链是任选的,所以 \((j - 1)!\) 仍然不变,代表钦定了第一条,剩下任意选,最后还剩下一个不准动。唯一的修改也是在最后的形式幂级数中:
计算答案全部卷起来就行了。时间复杂度 \(O(\sum\limits k^2)\)。
接下来三题都是形如:\(K\) 次操作取反之类的问题,前两个问题我们都采用生成函数刻画,但是最后一个问题并不采用这个方法而是直接考虑集合幂级数卷积。一方面是最后一道题用生成函数推导有点太困难了我还不会 QAQ,一方面也是提个醒不要被生成函数卷积给局限住啦。
zr3272
\(n\) 个点的树,每条边拥有权 \(p_i\) 与存在状况 \(c_i\)。无形的大手子进行了 \(K\) 次操作,每次有 \(\dfrac{p_i}{\sum_{j = 1}^{n-1}p_j}\) 取反 \(i\) 这条边的存在状况。求最终树上联通块大小乘积的期望。
猫生首次见到这种问题,猫很震撼!令 \(S = \sum\limits p\),接下来我们默认 \(S^{K}\) 最后除以。
首先考虑已知每条边存在情况计算概率。因为每个边有可能被取反多次,最后操作数量和为 \(K\),并不好直接刻画,所以我们采用 egf,这样卷积的过程天然为我们做好了这个背包。
对于第 \(i\) 条边,它取反情况记作 \(G_{i, 1}\),未被取反的情况记作 \(G_{i, 1}\),那么有:
盘面的 egf 为所有 \(G\) 的乘积 \(F\),那么最终概率为 \(K![x^K]F\)。令 \(F = \sum\limits_{i\in [-S, S]} c_ie^{ix}\),那么有:
维护 \(c_i\) 即可。
回到题目当中来,树形 dp 合并子树的时候考虑 \(u-v\) 选择哪一个 gf,重点在于我们无法轻易的维护“联通块乘积”这一个信息。使用组合意义,联通块乘积看作联通块内部选一个点方案数。这个可以增量计算,设 \(f[u, i, 0/1]\) 代表 \(u\) 所在联通块选/没选,当前维护的系数为 \(c_i\) 的系数只和。直接转移即可。
AT_abc231_g
离开事件发生独立性谈论期望的可乘性是无稽之谈。用生成函数刻画。
建立一个 gf,\([x^k]G_i(x)\) 代表 \(i\) 位置选中了 \(k\) 次的期望,也就是 \((a_i+k)\dfrac{1}{n^k}\)。外面套上 egf 计算可重集合,最后相乘卷积起来即可。
具体而言对于每个 \(i\) 的 ogf 为 \(G_i(x) = \sum\limits_{m = 0}{(a_i+{m})\dfrac{(\frac{x}{n})^m}{m!}}\)。最后计算 \(n![x^k]\prod_{i = 1}^nG_i(x)\) 即可。\(k\) 很大所以没有什么直接卷积的余地。考虑求出封闭形式后直接计算。
注意到 \(\frac{x}{n}e^{\frac{x}{n}}\) 看上去很难维护,但是对于每个 \(i\) 都有这一项,所以可以直接枚举乘积中选了多少项这个。考虑计算答案的贡献形式,答案形式为 \(t(\frac{x}{n}e^{\frac{x}{n}})^me^{\frac{(n-m)}{n}x}\),展开计算一下:
故第 \(k\) 项 \(\dfrac{tk!}{n^m(k-m)!}\)。对于相同 \(m\) 记录 \(t\) 和即可。直接 dp 即可。