正睿NOI2020集训 讲课 Day3

忘记哪里是上午哪里是下午了,就不分了。

下面 \(z\) 一般是真正的变量,\(x\) 可能是变量也有可能是关于 \(z\) 的一个多项式。

生成函数

好像并没有什么好写的……

为什么这是对的?背就完了

https://rqy.moe/Math/gf_correct/ 但我不可能去看的

多项式基本操作

也没什么好讲的……

多项式 \(\gcd\) :同样做欧几里得算法即可,用多项式取模优化。

多项式环是一个欧氏环。虽然不知道什么意思

一阶微分方程

\[{dx\over dz}=F(x) \]

考虑牛顿迭代。

扫描二维码关注公众号,回复: 11425588 查看本文章

\[{dx\over dz}=F(x_0)+F'(x_0)(x-x_0) \]

\[r=e^{-\int F'(x_0)dz} \]

然后两边同乘 \(r\) ,移项,再把左边那一坨替换一下,得到

\[{d(xr)\over dz}=(F(x_0)-x_0F'(x_0))r \]

所以把右边积分,再除 \(r\) ,就得到了 \(x\)

跑得没有分治 FFT 快,还不好推

多点求值

式子就不写了。

不过对 \(\prod (x-a_i)\) 取模这个思想还是要记住的。

例题:求 \(\prod_{i<j}(a_i-a_j)\) 。对任意模数取模。即 codechef 月赛的加强版。

于是就不能求出平方再开方了,只能强行上分治。

分治之后有一个简单的 \(O(n\log^3 n)\) 的多点求值做法,但是常数大复杂度也高。

考虑设 \(F_i(x)=\prod_{j<i} (a_j-x)\) ,那么就要求出 \(\prod F_i(a_i)\)

分治的时候往里传一个多项式 \(G\) ,表示除了内部对 \(F\) 的贡献以外还要整体乘上这个多项式。

分治左边的时候, 直接把 \(G\) 往下传。由于多点求值的思想,可以把 \(G\) 模一下 \(\prod _{l\le i\le mid} (x-a_i)\)

分治右边的时候,把 \(G\) 乘上左边的 \(\prod (a_j-x)\) ,然后同样取模一下即可。

复杂度 \(O(n\log^2 n)\)

牛逼多点求值。

传到一个区间的多项式长度不需要超过区间长度,因为这里每次 MULT 个 \(1-x_iz\) 只会把一个位置的次数减 1 ,所以更高的位置贡献不到 \([x^0]\)

板子只有 NTT 和分治 NTT /se

某 Comet OJ 题

发现答案就是

\[ans_i=[z^0]MULT(A(z),\prod_{j\ne i} (p_jz+1-p_j)) \]

于是做法和上面一模一样。

快速插值

没啥意思。

多项式复合

就是光速幂优化一下暴力而已。

注意 \(G^k\) 不能直接拿点值推,否则会因为循环卷积而暴毙。

多项式复合逆

形式幂级数正确性什么的全都不用管!

如果 \(F\) 是常数个基本初等函数复合那么就可以做到 \(O(n\log n)\) ,因为 \(F(x_0)\) 比较好算。

拉格朗日反演

只要背了结论就什么都不用管!

证明:

考虑 \(H(G(F(z)))=z\) ,所以设 \(P(z)=H(G(z))\) ,那么有 \(P(F(z))=H(z)\)

两边求导,暴力展开,得到

\[\sum_{i \geq 0}(i+1) p_{i+1} F^{i}(z) F^{\prime}(z)=H^{\prime}(z) \]

两边同除 \(F^n(z)\) ,那么右边就是 \(H'(z)({1\over F(z)})^n\) (即为拉格朗日反演的式子),左边是 \(\sum_{i \geq 0}(i+1) p_{i+1} F^{i-n}(z) F^{\prime}(z)\) ,再同时取 \([x^{-1}]\)

对于 \(i\ne n-1\)\(i-n\ne -1\) ,所以有 \(F^{i-n}(z) F^{\prime}(z)={(F^{i-n+1}(z))'\over i-n+1}\) 。因为求了导,于是 -1 次项是 0 。

\(i=n-1\) 的时候 \(F^{i-n}(z) F^{\prime}(z)={F'(z)\over F(z)}\) ,由某种理论此时的 -1 次项是 1 。

所以左边取 -1 次项得到的就是 \(n\times p_n\) ,证毕。

应用当然是有的,比如点双边双计数,或是二叉树计数,可以扩展到 \(k\) 叉树。

二叉树的生成函数有 \(F(z)=z(1+F(z))^2\) ,其复合逆为 \(G(z)={z\over (1+z)^2}\) ,所以套一手拉格朗日反演, \([z^n]F(z)=\frac 1 n [w^{n-1}]({w\over G(w)})^{n}\) ,推一推就出来了。

上面那个求导是对 \(w\) 求导。所说的二元生成函数大概是 \(H(u,F(z))={1\over 1-uF(z)}\)

\(H(u,z)={P(F(z))\over 1-uF(z)}\) 也可以算?

只能求到 \([z^n]F^n(z)\) 是因为 \(F\) 常数项为 0 ,\([z^{n+1}]\) 已经是 0 了。

\(F(x)=G(x)+c\) ?求出 \(G\) 的答案然后再二项式展开即可。

一次项系数不是 1 ?随便搞。

最低次项不是 \(z^1\) ?开一个 \(k\) 次根然后乱搞。

ZJOI2020 抽卡

对于一段连续的卡,考虑在它前面补一个肯定不选的,然后把它分成若干段,每一段由一个不选的卡开始,连续不超过 \(k-1\) 张选的卡。

\(u\) 是不选的卡, \(z\) 是总卡数,那么对于一段长度为 \(n\) ,得到的答案是:

\[[z^{n+1}]\frac 1 {1-u{z(1-z^k)\over 1-z}} \]

\(F(z)={z(1-z^k)\over 1-z}\) ,大概是可以牛顿迭代得到复合逆的。

常系数线性递推

好,这个我会

TRIPWAYS

怎么好像做过这题啊

有这么个生成函数:\(F_i(x)={x\over 1-L_ix}\sum_{(j,i)\in E} F_j(x)\)

显然 \(F_n(x)={P(x)\over Q(x)}\) ,其中 \(Q(x)=\prod (1-L_ix)\)

怎么求 \(P\) 呢?大概 \(O(nm)\) 就能随便搞出来了吧。也可以无脑求出 \(F_n(x)\) 的前 \(n\) 项,然后乘上 \(Q\) ,那么取前 \(n\) 项就是 \(P\)

但是 \(D\) 很大,怎么处理询问呢?

我会无脑线性递推

由于我们知道 \(Q\) 的分解,并且分解出来形式不错,所以可以搞到更好的复杂度。

“有理生成函数的一般展开定理”

当然作为没有梦想的咸鱼,我不需要知道为什么这个定理是对的,只要会求就行。

\(L\) 排序,设去重之后有 \(d\) 个不同的,设为 \(p\) ,其中 \(p_i\) 出现了 \(r_i\) 次。那么 \(F_n(x)\) 就可以被分解为

\[\sum_{i=1}^{d} \sum_{j=1}^{r_{i}} \frac{a_{i,j}}{\left(1-p_{i} x\right)^j} \]

那么

\[[x^k]F_{n}(x)=\sum_{i=1}^{d} \sum_{j=1}^{r_i} a_{i, j} \left(\begin{array}{c} k+j-1 \\ j-1 \end{array}\right) p_{i}^{k} \]

(也就是考虑每一项的贡献)

但是怎么分解得到 \(a_{i,j}\) 呢?

妙啊!

考虑先分解成这样的形式: \(F_n(x)=\sum_{i=1}^d {C_i(x)\over (1-p_ix)^{r_i}}={P(x)\over \prod (1-p_ix)^{r_i}}\)

通分,然后两边同时模一个 \((1-p_ix)^{r_i}\) ,设 \(R_{i}(x)=\prod_{j \ne i}\left(1-p_{j} x\right)^{r_{j}}\) ,就可以知道 \(C_i(x)R_i(x)=P(x)\pmod{(1-p_ix)^{r_i}}\) 。别的东西呢?取模的时候消掉了。

发现 \(1-p_ix\) 这个形式很特殊,所以可以令 \(y=1-p_ix\) ,得到 \(x\) 关于 \(y\) 的表达式,代入原式中,得到

\[C'_i(y)R_i'(y)=P'(y)\pmod {y^{r_i}} \]

求逆即可得到 \(C'(y)\) ,然后发现这东西甚至不需要变回来,直接就可以求出 \(a_{i,j}\)

做基变换可以暴力二项式展开,取模的过程可以分治的时候取模,所以复杂度 \(O(n\log^2 n)\)

暴力做法其实也挺妙的:同样是通分,但不取模,而是代入 \({1\over p_i}\) ,那么除了 \({a_{i,r_i}\over (1-p_i)^{r_i}}\) 对应的项以外其他全都变成 0 了,就可以求出 \(a_{i,r_i}\) ,然后消掉它之后暴力更新 \(P\)

任意模数FFT

这个我会

四次FFT做法:

\(P=A+Bi,Q=A-Bi\)

\[P(\omega^k)=\sum_{j=0}^{l-1} (a_j+ib_j) \omega^{jk}\\ =\sum_{j=0}^{l-1} (a_j+ib_j) (\cos+i\sin)\\ =\sum (a\cos-b\sin)+i(a\sin+b\cos) \]

而在对 \(Q\) 进行 DFT 的时候,如果代入 \(\omega^{-k}\) ,得到的结果会是 \(P(\omega^k)\) 的共轭复数。

所以把 \(P\) DFT 的结果 reverse 一下,取共轭,就可以求出 \(G\)

\({P\pm G\over 2}\) 就是 \(A,B\) 分别的 DFT 结果。

总共FFT四次。

某题

题面写错了一点,是 \(q\) 次询问 \(m\)\(m\le 10^9\)

考虑枚举一个 \(t\) ,求 \(\sum_{i=0}^m i^tk^i\)

不知道为什么把 \(i^t\) 替换成 \(t![z^t]e^{iz}\) ,那么这个式子变成了

\[t![z^t]{1-(e^zk)^{m+1}\over 1-e^zk} \]

所以答案就是

\[\sum_{t=0}^n a_tt![z^t]{1-(e^zk)^{m+1}\over 1-e^zk} \]

\(b_{n-t}=a_tt!\) ,对应的多项式是 \(G(z)\) ,那么答案就是

\[[z^n]G\cdot {1-(e^zk)^{m+1}\over 1-e^zk} \]

注意到除了 \(e^{(m+1)z}\) 其他都很好处理,而这个东西和系数序列为 \(c\) 的相乘,得到的东西是 \(\sum_{i} {c_{n-i}\over i!}(m+1)^i\) ,可以多点求值做出来。

所以最后复杂度是 \(O(n\log n+q\log^2 n)\)

斯特林容斥

列斯特林数的 EGF :…… 就是把一个元素的 EGF 搞出来, \(k\) 次幂再除以 \(k!\) 即可。

\[\sum_n {z^n\over n!} \left[\begin{array}{c} n \\ k \end{array}\right]={(-\ln(1-z))^k\over k!} \\ \sum_n {z^n\over n!} \left\{\begin{array}{c} n \\ k \end{array}\right\}={(e^z-1)^k\over k!} \]

斯特林容斥用在计算划分集合的方案数,有两种情况:要么是容易钦定一个集合不会与外界合并,要么是容易钦定一个集合不会分裂。

钦定了之后,要给这个钦定的方案一个贡献的权值,需要保证对于一个实际的划分方案,它被计算的贡献是对的。

假设一个方案的贡献只和集合大小或集合数量有关,真正的贡献的 EGF 是 \(F(z)\) ,在钦定的时候给的贡献是 \(G(z)\)

两个都有关?不会。

第一种

一个真正的方案中的若干个集合,在钦定的时候可能会被合并成一个集合。

大小有关

不会。

数量有关

考虑一个真正的方案,有 \(n\) 个集合,贡献为 \(f_n\) ,那么 \(g\) 就需要满足

\[f_n=\sum_i \left\{\begin{array}{c} n \\ i \end{array}\right\} g_i \]

两边求和,交换求和符号,得到

\[F(z)=\sum_i g_i \sum_n {z^n\over n!} \left\{\begin{array}{c} n \\ i \end{array}\right\} =\sum_i g_i {(e^{z}-1)^i\over i!}=G(e^z-1) \]

第二种

一个真正的方案的一个集合,在钦定的时候可能会被分解成若干个小集合。倒过来,就是用小集合拼成大集合。

大小有关

我们需要每一种分解方式的大小的贡献的乘积的和恰好是真正的贡献。

把小集合拼成大集合,权值为小集合的权值相乘,显然就是一个 exp ,所以有关系式 \(F(z)=e^{G(z)}-1\) 。减一是因为空集不合法。

数量有关

不会。

U群把妹王

显然在此时可以用斯特林反演:钦定某一些行相等、列相等,算方案数是不难的。

如果行和列分别被划分成了 \(c_1,c_2\) 个相等的集合,那么方案数是 \(k^{c_1c_2}\)

题目的限制是和集合大小有关,钦定的是一个集合不分裂,所以恰好符合上面第二种情况。

两维可以分开做,容斥的式子不变。

\(f_i\) 为把行分成 \(i\) 个集合的方案数(或者更准确,贡献),\(F(z)\) 为合法的行集合大小组成的 EGF ,那么有

\[f_i=n![z^n]{(\ln(1+F(z)))^i\over i!} \]

发现这个 \([z^n](\ln(1+F(z)))^i\) 也还是不好求……吗?

可以用上面说的拉格朗日反演算出来:由于 \(F(z)\) 非常稀疏,所以 \(\ln(1+F(z))\) 的逆可以用牛顿迭代在 \(O(an\log n)\) 的时间内求出。

最后答案是 \(\sum_i \sum_j f_ig_jk^{ij}\) ,用一下 bluestein 就做完了。

ZR某题

\(F^n(z)\pmod {z^X}\)

\(F^{X+1}(z)\) 求导,有两种求法,发现两个东西比对一下系数就可以求出 \(F^{X}(z)\) 了。

复杂度 \(O(kx)\)

甚至可以在 \(n\) 不为整数的时候用。

牛顿恒等式

可以有重根。

据说牛顿恒等式那两个式子不怎么用到,那就不管它了吧,只看下面的式子。

\[G(z)=\sum_{i=0}^{n} a_{i} z^{i}=\prod_{i=1}^{n}\left(1-x_{i} z\right) \]

这是为什么呢?注意 \(a\) 是反的多项式系数,所以 \(G\) 是原多项式的 reverse 。原多项式是 \(\prod_{i=1}^{n}\left(z-x_{i}\right)\) ,所以每一项 reverse ,就得到了第二个等号。

\(F(z)=\frac{-G'(z)}{G(z)}\) 等价于 \(\int F=-\ln G\) ,右边这个式子容易发现是对的,所以左边是对的。

能不能证明牛顿恒等式就不重要了因为肯定是可以的,关键在于 根的幂和 与 多项式系数,这两个可以互推了。

多项式求和

考虑 \(f_i(m)\) 到底是什么:从 \((0,?)\) 开始走,每次横坐标加 1 ,纵坐标单调不降,贡献是关于原纵坐标的一个二次函数,最后走到 \((i,m)\)

考虑每个二次函数贡献了多少次,那么可以得到

\[f_i(m)=[x^i]\prod_{k=0}^m {1\over 1-(ak^2+bk+c)x} \]

所以只要算出右边那坨东西就做完了。

然而 \(m\) 实在太大,好像不是很好做?

首先由于 \(i\) 不大,所以可以求出 \(\prod_{k=0}^m (1-(ak^2+bk+c)x)\pmod{x^n}\) ,最后再求个逆。

发现如果设 \(x_k=ak^2+bk+c\) ,那么这个形式就是上面的 \(G(x)\) ,所以只要能求出 \(F(x)\) 就做完了。

也就是要求 \(x_k=ak^2+bk+c\) 的幂和。

\(a=0\) 时,暴力二项式展开,然后用伯努利数求一下自然数幂和,就做完了。

否则,配方成 \(a(k+?)^2+??\) ,然后 \(k+?\) 相当于平移了一下,平方相当于做自然数幂和之后取偶数项,然后下标除个 2 。

猜你喜欢

转载自www.cnblogs.com/p-b-p-b/p/13368819.html
今日推荐