数学杂谈 #25

论在做计数题前先学会找规律或在学习 GF 前先学会解微分方程的必要性

(副标题:——把简单情景复杂化有感)

问题

你有一个长度为 \(2n-1\)\(1\) 开头的 \(01\) 交替串。你可以进行如下操作:每次选定一个\(1\) 开头结尾\(01\) 交替子串,并将其中的 \(0\) 变为 \(1\)\(1\) 变为 \(0\)。求出你有多少种方案进行恰好 \(k\) 次操作,对 \(998244353\) 取模。

两种方案被认为不同,当且仅当在某一步中它们各自操作的子串对应区间不同。

法一:某个 DP

\(f_{n,m}\)\(2n-1\) 的串进行恰好 \(m\) 次操作的方案数。

一种构造方式为,考虑第一个 \(1\) 被是否被操作以及被操作的时间,可以写出:

\[f_{n,m}=\sum_{0\le k<n} f_{k,m}+\sum_{k=1}^n\sum_{j=0}^{m-1}\binom{m}{j+1}f_{k-1,j}f_{n-k,m-1-j} \]

现在需要一点观察:我们注意到两维几乎是独立的。其中,第一维始终要么在做前缀和,要么在做卷积,都是很容易处理的组合运算。所以,我们考察第二维的形态:相当于给出了一棵有标号的二叉树,每个结点要么是叶子,要么是有两个儿子,所以总共有 \(2k+1\) 个结点。第一维就是在给每个结点分配权值,使得总和为 \(n\),且非叶子结点权值 \(\ge 1\),其它结点权值 \(\ge 0\)

容易计算得出,这个方案数就是 \(\dbinom{n+k}{2k}\),用插板法或者其它什么东西算即可。

现在专攻第二维的运算。设 \(g_{n}\) 为第二维为 \(n\) 时贡献的因子,则容易写出转移:

\[g_n=\sum_{k=0}^{n-1}\binom{n}{j+1}g_jg_{n-1-j} \]

Remark.

其实现在已经可以解决了:\(g\) 是一个足够简单的数列,找规律就可以找出来通项,为 \(g_n=(2n-1)!!=\prod_{k=1}^{n}(2k-1)\)

你可以比较一下找规律和纯代数方法的复杂性。这就是为什么解决数列问题时总应该观察前几项找一找规律。

从某种意义来说,找规律才是研究数列最直接的手段,尽管它不总是最有效的。

\(G(x)\)\(\{g_n\}\) 的 EGF,可以得到方程为:

\[G(x)=G(x)\cdot \int G(x)\,\text dx+1 \]

积分不是很好处理,但是可以换元。设 \(H'(x)=G(x)\),常数项为 \(0\),则可以改写为:

\[H'(x)=H'(x)H(x)+1 \]

现在可以直接解微分方程。因为我不是很熟悉,所以在这里详细地写一遍:

\[\begin{aligned} (1-H)\frac{\text{d} H}{\text dx}&=1\\ (1-H)\text dH&=\text dx\\ \int (1-H)\,\text dH&=\int \,\text dx\\ -\frac 1 2 H^2+H+C_1&=x+C_2 \end{aligned} \]

讨论常数项可以发现 \(C_1-C_2=0\),所以我们得到了一个复合方程:

\[-\frac 1 2 H^2(x)+H(x)=x \]

相应地,也就有了复合逆 \(F(x)=-\frac 1 2 x^2+x\),并且 \(H(F(x))=x\)。使用拉格朗日反演:

\[\begin{aligned} \frac{g_{n-1}}{n!} &=\frac{1}{n}[x^{n-1}]\left(\frac x {F(x)}\right)^n\\ &=\frac{1}{n}[x^{n-1}]\frac{1}{(1-\frac 1 2x)^n}\\ &=\frac 1 {n2^{n-1}}\binom{2n-2}{n-1}\\ &=\frac 1 {n2^{n-1}}\binom{2n-2}{n-1}\\ g_n&=\frac {n!}{2^n}\binom{2n}{n} \end{aligned} \]

到这里,我们已经可以直接 \(O(n)\) 算出来 \(g\) 了。不过,这个结构很熟悉,我们仔细观察一下,发现它其实就是:

\[\frac{(2n)!}{n!\cdot 2^n}=\frac{(2n)!}{\prod_{k=1}^n2k}=\prod_{k=1}^n(2k-1) \]

也就是一开始我们找规律找到的双阶乘。

Note.

不装了。直接解二次方程可以得到封闭形式:

\[H(x)=1-\sqrt{1-2x} \]

法二:某个 DP

简单:更容易构造组合含义。

仍然考虑 DP,不过这次我们直接枚举第一次操作的字符串的区间。

沿用 \(f_{n,m}\) 的记号(含义相同),而转移为:

\[f_{n,m}=\sum_{l=1}^n\sum_{r=l}^n\sum_{a+b+c=m-1,0\le a,b,c}f_{l-1,a}f_{r-l,b}f_{n-r,c} \]

现在两维都是平凡的卷积了。将第二维看作是枚举三叉树的分治形态,则第一维就是在三叉树的叶子上任意分配 \(\ge 0\) 的权值,并且要求和 \(=n-k\),很明显方案数还是 \(\dbinom{n+k}{2k}\)

第二维已经很明显了,就是计算分治三叉树的方案数。考虑从叶子开始,每次合并相邻的三个结点来形成一棵三叉树,这样可以讨论出贡献为 \((2k-1)\times (2k-3)\times \dots\times 3\times 1=(2k-1)!!\)

Remark.

选择法一,是因为直觉上认为每次枚举更多的变量会带来更复杂的和式,可能不利于后续的化简。并且“枚举第一个”也是比较常见的构造方法。

但事实证明,法二在结构上是更加清晰、更简单的,这可能也是为什么它会更容易地生成一个组合含义。而 \(g_n\) 这样的东西则不那么明了。

posted @ 2023-02-10 22:57  crashed  阅读(97)  评论(0编辑  收藏  举报