定义引号序列为:
- 空串
- 引号序列前后各添加一个相同的字符
- 两个引号序列连接起来
给定
OEIS 上对引号序列的定义: > the number of length 2n k-ary words (n,k>=0) that can be built by repeatedly inserting doublets into the initially empty word
这是雅礼模拟考试的一道题 (by yyt).
本文讨论生成函数暴力展开的方法 >_< 其他做法移步 「6月雅礼集训 2017 Day10」quote - Galaxies
OEIS 查二维数列的方法见 Hints for Using OEIS
仿照卡特兰数, 我们来为引号序列建立状态只有一维的递推.
以下讨论中, 如未特别说明, 字符集大小默认为
模型转化
一个引号序列对应
如: abbacc
<-> a 入, b 入, b 出, a 出, c 入, c 出
但是 abbaaa
该对应以下哪一个呢? - a 入, b 入, b 出, a 出, a 入, a 出 - a 入, b 入, b 出, a 入, a 出, a 出
我们规定对应第一个. 即: 栈顶元素等于当前字符时, 选择弹栈而非压栈.
建立递推
设
设
生成函数
用生成函数来表达:
解之, 得
不知道前几天为什么觉得做到这一步就进行不下去了......
大力展开
卡特兰数的生成函数为
分母有理化后, 用广义二项式定理展开根式, 进而得到闭形式. 我们来效仿这个做法.
令
还是很腌臢......值得庆幸的是, 我们并不追求一个优美的闭形式 (在 OEIS 上没找到), 只需要把它展开, 得到一个足够好算的式子.
把分子分母分别展开:
于是
又 (注意此时
代入, 得
一阶递推
上面的式子虽然不怎么漂亮, 但是计算起来挺方便, 因为二项式系数的指标并不涉及
撒花~