新的课件凭空出现

前排提醒:“没有写过代码的人,他的内容的可信度只有 \(\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}\),求

\[[x^n]\frac{2+F(x)}{1-F(x)G(F(x),w)}\bmod w^{n+1} \]

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\),存在唯一分解式

\[\frac{P(x)}{Q(x)}=\sum_{i=1}^{r}\frac{R_i(x)}{(1-a_ix)^{k_i}},\quad\deg R_i(x)<k_i \]

若其已知,则算 \([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)\frac{Q(x)}{q_i(x)}\equiv P(x)\pmod{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)\),因此就是

\[\left[{x^m\over m!}\right]\frac{1}{i!}\left(-\ln(1{-}x)-x\right)^i \]

通过多点求值,计算 \(f_i=F(i)\) 后,答案即

\[g_m=\left[{x^m\over m!}\right]\sum_{i=0}^{n}\frac{f_i}{i!}(\ln(1{-}x)+x)^i \]

引入 \(y\) 来形象地解释这一问题。记 \(\lambda(x)=\ln(1{-}x)+x\),则答案为

\[[y^n]F^{\sf T}(y)\exp(y\lambda(x)) \]

其中 \(F^{\sf T}(y)=\sum_{i=0}^{n}f_iy^{n-i}\) 。注意到 \(\phi(x,y)=\exp(y\lambda(x))\) 有整式递推

\[{\partial\phi(x,y)\over\partial x}=\phi(x,y)\cdot\frac{xy}{1-x} \]

接下来就是魔法了。原问题是

\[g_m=\sum_{i=0}^{n}f_i[x^my^i]\phi(x,y)\quad(0\leqslant m\leqslant n) \]

这就是矩阵 \(A_{m,i}=[x^my^i]\phi(x,y)\) 与列向量 \(v_i=f_i\) 的乘法。将 \(v\) 视作输入,则该问题的转置为

\[g^{\sf T}_m=\sum_{i=0}^{n}f_i[x^iy^m]\phi(x,y) \]

变成了乘行向量。这是二元 \(\rm GF\) 不可思议的基变换!

现在专心于解决转置问题,即 \([x^n]F^{\sf T}(x)\phi(x)\) 。此时可以在 \(x\) 这一维上做整式递推

\[(n{+}1)h_{n+1}(y)=nh_n(y)+yh_{n-1}(y) \]

其中 \(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)\) 分治。但如果我们故技重施,我们将看到其转置问题是

\[[t^n]\frac{A(t)}{1-tx(1{-}x)}=\sum_{i=0}^{n}[x(1{-}x)]^i[z^{n-i}]A(z) \]

没错,就是多项式复合。右复合二次式可以做到 \(\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{V}_{n,m}=\mathbf{X}(n,m)\mathbf{V}_{n-1,m}=\mathbf{Y}(n,m)\mathbf{V}_{n,m-1} \]

其中 \(\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}\) 时的

\[f_d(s)=\prod_{j=0}^{d-1}\mathbf{X}(iB,\;s{+}j) \]

若将 \(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)\) 。因此最终复杂度是

\[\mathcal O\left(q\sqrt{B}\log n+\frac{n^2}{B^2}\log n\right)\geqslant\mathcal O(n^{0.4}q^{0.8}\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\),即

\[{n\brace n-k}=\left[\frac{x^n}{n!}\right]\frac{(\exp(x)-1)^{n-k}}{(n-k)!} \]

我们需要关于 \(k\) 的答案,因此引入新变元 \(u\),求算

\[\left[\frac{x^n}{n!}\right]\text{e}^{u(\text{e}^x-1)} \]

因为 \((\text{e}^x-1)\) 有复合逆 \(\ln(x{+}1)\),所以上式为

\[[x^{-1}]\exp(ux)\frac{1}{x+1}\frac{1}{\ln(1{+}x)^{n+1}} \]

此时若求 \(u^{n-k}\) 项系数,则得到

\[\frac{1}{(n{-}k)!}[x^{k-1-n}]\frac{1}{x+1}\frac{1}{\ln(1{+}x)^{n+1}} \]

恰好 \(\ln(1{+}x)\) 没有常数项,不易求逆。不如将其修补好:

\[\frac{1}{(n{-}k)!}[x^{k-1}]\frac{1}{x+1}\left(\frac{\ln(1{+}x)}{x}\right)^{-n-1} \]

使用多项式快速幂就得到了 \(\mathcal O(m\log n)\) 做法。

posted @ 2022-07-13 19:41  OneInDark  阅读(156)  评论(9编辑  收藏  举报