新的课件凭空出现
前排提醒:“没有写过代码的人,他的内容的可信度只有 \(\epsilon\) 那么大。”——摘编自 \(\sf Rainybunny\)
线性递推
等价于有理分式 \(F(x)=\frac{P(x)}{Q(x)}\) 。
Example 1.(在 \(\rm accoders\) 上的) 被 \(\textsf{OUYE}\) 切穿的题。类 \(\textit{Bostan-Mori}\) 。
Example 2.(恶心题面) 设 \(F(x)=\frac{x}{(1-x)^3},\;G(x,w)=\frac{xw(1+w)}{(1-xw)^2}\),求
Solution. 直接当线性递推做。化简避免分式后,可知是常数项的线性递推,并且 \(w\) 的次数和 \(x\) 次数同阶。
因此直接维护每个 \(x^i\) 的系数,用 \(\textit{Bostan-Mori}\) 算法即可。复杂度 \(\mathcal O(n\log n)\) 因为 \(f(w)\) 的次数是翻倍增长的。就是可能常数大一点。
Example 3.(完全背包) 求 \([x^s]\prod_{i=1}^{n}(1-x^{c_i})^{-1}\),其中 \(s\leqslant 10^{100}\) 但 \(n\leqslant 50\) 且 \(c_i\leqslant 500\) 。
Solution. 直接 \(\textit{Bostan-Mori}\) 就可以给出 \(\mathcal O(n^2c\log s)\) 做法:上下同时乘 \(\prod(1+x^{c_i})\) 即可。注意乘单个 \((1+x^{c_i})\) 是 \(\mathcal O(nc)\) 的,且分子度数始终为 \(\mathcal O(nc)\) 。
你成功地发现了倍增优化背包。—— \(\sf OUYE\)
分式分解
\(\textsf{EI}\) 的博客:在 \(\textsf{OUYE}\) 面前的败北者的最大狂欢(确信)。
设 \(Q(x)=\prod_{i=1}^{r}(1-a_ix)^{k_i}\) 。因为显然可以假定 \([x^0]Q(x)=1\) 。
记 \(n=\sum k_i=\deg Q(x)\),设 \(\deg P(x)<n\),存在唯一分解式
若其已知,则算 \([x^t]{P(x)\over Q(x)}\) 可以枚举 \(R_i(x)\) 的每一项,做到 \(\mathcal O(n+r\log t)\) 的计算(计算 \(a_i^{\thinspace t}\) 需快速幂)。组合数可以现场求。
为了方便,简记 \(q_i(x)=(1-a_ix)^{k_i}\) 。事实上,只要诸 \(q_i(x)\) 互质即可分解。
为何唯一且存在。考虑通分后的结果中,分子为 \(\sum R_i(x)\frac{Q(x)}{q_i(x)}\),那么我们就知道
解出来就是 \(R_i(x)=P(x)\cdot \text{inv}\left(\frac{Q(x)}{q_i(x)},q_i(x)\right)\bmod q_i(x)\) 。唯一性证毕。又因 \(P(x)\) 模 \(\forall q_i(x)\) 的结果正确,合法性证毕。
考虑计算 \(Q(x)\over q_i(x)\) 。不基于 \(\textit{FFT}\) 时可以 \(\mathcal O(\deg Q\deg q_i)\) 。求逆可以用 \(\text{exgcd}\),亦 \(\mathcal O(\deg Q\deg q_i)\) 。乘 \(P(x)\) 就暴力,总复杂度 \(\mathcal O(\deg Q\sum\deg q_i)=\mathcal O(n^2)\) 。
基于 \(\textit{FFT}\) 时,用 多点求值
方法求解所有 \(\frac{Q(x)}{q_i(x)}\bmod q_i(x)\) 和 \(P(x)\bmod q_i(x)\) 。求逆可以用多项式欧几里得(没人写那玩意儿)。对于较简单的 \(q_i(x)=(1-a_ix)^{k_i}\),记 \(t=1-a_ix\) 则目标就是求 \(F(\frac{1-t}{a_i})\) 在模 \(t^{k_i}\) 意义下的逆元,最后换元回 \(x\) 即可。复合单项式是 \(\mathcal O(k_i\log k_i)\) 的。总复杂度 \(\mathcal O(n\log^2 n)\) 。
Remark. 这个结构就是 \(\textit{CRT}\) 的结果,因为 \(P(x)\over Q(x)\) 和 \(P^{\sf T}(x)\bmod Q^{\sf T}(x)\) 是本质相同的。
转置原理
线性算法,时空复杂度几乎不变,转置矩阵。在某些情况下可以用来卡常。
但它最强的玩法是,解决转置问题,然后将该解法转置来解决原问题。比如 多点求值
。
Example 4.(题面) 求 \(\sum F(c_\pi)\),其中 \(\pi\) 是无自环的置换,\(c_\pi\) 是 \(\pi\) 的循环数量。
Solution. 考虑长为 \(m\) 且有 \(i\) 个环的方案数。单环的 \(\rm EGF\) 是 \(\int\frac{1}{1-x}=-\ln(1{-}x)\),因此就是
通过多点求值,计算 \(f_i=F(i)\) 后,答案即
引入 \(y\) 来形象地解释这一问题。记 \(\lambda(x)=\ln(1{-}x)+x\),则答案为
其中 \(F^{\sf T}(y)=\sum_{i=0}^{n}f_iy^{n-i}\) 。注意到 \(\phi(x,y)=\exp(y\lambda(x))\) 有整式递推
接下来就是魔法了。原问题是
这就是矩阵 \(A_{m,i}=[x^my^i]\phi(x,y)\) 与列向量 \(v_i=f_i\) 的乘法。将 \(v\) 视作输入,则该问题的转置为
变成了乘行向量。这是二元 \(\rm GF\) 不可思议的基变换!
现在专心于解决转置问题,即 \([x^n]F^{\sf T}(x)\phi(x)\) 。此时可以在 \(x\) 这一维上做整式递推
其中 \(h_n(y)=[x^n]\phi(x,y)\) 。不难将其写为元素为 \(R[\![y]\!]\) 的矩阵,利用分治进行矩阵乘法,在乘法链的末端乘上 \([x^i]F(x)\) 算答案。时间复杂度 \(\mathcal O(n\log^2 n)\) 。
把这个算法转置就得到原问题的答案。类似于多点求值,需要从上往下
分治,做减卷积往下传递值。
Remark. 也许转置跟对偶一样:有时它是不可替代的思维方式。
Example 5.(SDOI D2T3 但是我没找到) 计算 \([x^n]\frac{A(x)}{1-tx(1{-}x)}\bmod t^{n+1}\) 。
Solution. 一眼线性递推,鉴定为 \(\mathcal O(n\log^2 n)\) 分治。但如果我们故技重施,我们将看到其转置问题是
没错,就是多项式复合。右复合二次式可以做到 \(\mathcal O(n\log n)\),你晓得吗?配方成顶点式 \(a(x-x_0)^2+c\),就只需要复合 \((ax+c)\circ x^2\circ(x-x_0)\) 。
Example 6.(诈骗题) 对 \(P(x)=x\) 进行最小次数的两种操作,使得 \(P(x)=Q(x)\) 。两种操作是 \(P(x)\gets P(x)+c\) 和 \(P(x)\gets P(x)^c\),其中 \(c\) 为任意常数。所有操作在模 \(998244353\) 意义下进行。
Solution. 考虑逐个撤销操作是困难的。诈骗之处在于:我们竟然可以确定第一次操作的参数。
令 “求幂” 操作的参数名为 \(k\) 。注意到 \(Q(x)=H((x{+}c_1)^{k_1})\;(k_1\geqslant 2)\) 其中 \(H(x)\) 是以后的操作的效果,令 \(G(x)=H(x^{k_1})\),记 \(n=\deg G(x)=\deg Q(x)\),则 \([x^{n}]G(x)=1\) 且 \([x^{n-1}]G(x)=0\) 。于是 \([x^{n-1}]G(x{+}c_1)=nc_1\),所以我们把 \(c_1\) 解出来了!
反解出 \(G(x)\),可以发现 \(k_1\) 就是所有非零系数位置的 \(\gcd\) 。因为若不是,那接下来就会解出 \(c_2=0\),这与最小操作次数不符(不应有连续的求幂
操作)。
很有趣的是,我们没有任何决策。所以直接检验就行了。由于 \(k>1\),复杂度 \(\mathcal O(n\log n)\) 。
二元整式递推 \(\rm GF\) 多点求值
可见于 \(\sf EI\) 的博客。简单来说:过分劲爆。
将问题抽象为:每个位置的信息是向量 \(\bf V\),其存在转移
其中 \(\mathbf{X},\mathbf{Y}\) 中只含有关于 \(n,m\) 的有理分式,且 \(nm=0\) 时 \(\mathbf{V}_{n,m}\) 易于求算。
特别地,认为 \(\mathbf{X},\mathbf{Y}\) 中 \(n,m\) 的有理分式的分子分母次数以及 \(\mathbf{V}\) 的长度都是常数。
问题:\(q\) 次求算 \(\mathbf{V}_{n,m}\) 。下面记 \(n\) 为询问中 \(\max\{n,m\}\) 。
强制在线
设块大小 \(B\),我们先求出 \((iB,jB)\) 处的 \(\mathbf{v}\) 。那么只需求解 \(d={n\over B}\) 时的
若将 \(s\) 视为形式变元,则矩阵 \(f_d(s)\) 中每个元素都是分子分母次数为 \(\mathcal O(d)\) 的关于 \(s\) 的有理分式。因此,对每个分子分母,分别保留前 \(\mathcal O(d)\) 个 \(s\) 对应的点值即可。在倍增 \(d\) 之前,用 \(\textit{FTT}\) 求得两倍长度的 \(s\) 的点值,然后直接作乘法即可。
Remark. 为什么分子分母的次数都是 \(\mathcal O(d)\) 呢?考虑提前对转移矩阵通分,即得到 \(A\over P(x)\) 其中 \(A\) 是 \(R[x]\) 上的矩阵。那么 \(\prod A\) 中元素次数为 \(\mathcal O(d)\),而 \(\prod P(x)\) 次数也为 \(\mathcal O(d)\),得证。
长度在倍增,复杂度 \(\mathcal O(\frac{n}{B}\log n)\),乘 \(i\) 的数量就是总复杂度 \(\mathcal O(\frac{n^2}{B^2}\log n)\) 。
对于每组询问,可以用相同的方法,从 \((\lfloor{n\over B}\rfloor,\lfloor{m\over B}\rfloor)\) 转移到 \((n,m)\),复杂度 \(\mathcal O(\sqrt{B}\log n)\) 。因此最终复杂度是
当且仅当 \(B=\mathcal O(n^{0.8}q^{-0.4})\) 时取等。这看上去相当毒瘤。
离线做法
按:建议使用莫队 \(\mathcal O(n^{1.5})\) 。
两位交替变换 \((n,m)\) 的二进制位,即每次求出 \(B=2^k\) 的所有 \(\mathbf{V}_{iB,jB}\) 。当然,如果没有询问 \((x,y)\) 满足 \(\lfloor{x\over B}\rfloor=i\),就忽略这个 \(i\) 。同样的规则也运用在 \(j\) 上。
如何迭代?大力乘出 \(f(j)=\prod_{t=0}^{2^{k-1}}\mathbf{X}_{iB,jB+t}\),然后多点求值得到对每个 \(j\) 的结果。作乘法就得到新的散点值。类似的过程也运用在另一个维度上。
按:这像是整体逼近
,即求出的点值不断逼近询问,并且是同步的。
因此,对于每个 \(i\),复杂度是 \(\mathcal O(B\log^2 B)\) 的分治乘法和 \(\mathcal O(n_i\log^2 n_i)\) 的多点求值,其中 \(n_i\) 是落在这个 \(i\) 里的询问,因此 \(\sum n_i=q\) 。恰好有 \(\mathcal O({n\over B})\) 个不同的 \(i\),因此一层的复杂度是 \(\mathcal O(n\log^2 B+q\log^2 q)\) 。共 \(\log n\) 层,总复杂度 \(\mathcal O(n\log^3 n+q\log^2q\log n)\) 。
拉格朗日反演
内容。其实你也可以相信 \(\rm NOI\) 不会有这种数学 \(\rm trick\) 题。
Example 7. 第二类斯特林数行后缀 \({n\brace n-k}\;(k\in[0,m])\),且 \(n\) 很大。
Solution. 用容斥式做卷积不太好搞。考虑用列上的 \(\rm EGF\),即
我们需要关于 \(k\) 的答案,因此引入新变元 \(u\),求算
因为 \((\text{e}^x-1)\) 有复合逆 \(\ln(x{+}1)\),所以上式为
此时若求 \(u^{n-k}\) 项系数,则得到
恰好 \(\ln(1{+}x)\) 没有常数项,不易求逆。不如将其修补好:
使用多项式快速幂就得到了 \(\mathcal O(m\log n)\) 做法。
如果这篇文章对你有帮助,那么作者是:OneInDark,原文在:https://www.cnblogs.com/OneInDark/p/16475318.html,否则我也不知道这是谁的文章。