Raney 引理与循环引理
Raney 引理和卡特兰数有着非常紧密的联系。
上式左侧是普通卡特兰数,右侧则是我们后面会遇到的妙妙道具。
原始表述
我们约定,前缀和为 \(S_i\),序列总和为 \(S_n\)。
普通 Raney 引理有一共四种等价表述。对于一个整数序列 \(x_1,x_2,...x_n\):
表述 1:满足 \(S_n = 1\),那么其 \(n\) 个循环位移中恰好仅有一个移位满足所有 \(S_i \gt 0\);
表述 2:满足 \(S_n = -1\),那么其 \(n\) 个循环位移中恰好仅有一个移位满足所有 \(S_i \lt 0\);
表述 3:满足 \(S_n = 1\),那么其 \(n\) 个循环位移中恰好仅有一个移位满足 \(S_i \le 0\) \((1 \le i \lt n)\);
表述 4:满足 \(S_n = -1\),那么其 \(n\) 个循环位移中恰好仅有一个移位满足 \(S_i \ge 0\) \((1 \le i \lt n)\)。
表述 \(1,2\) 和 \(3,4\) 都只是将正负号互换(交换了正负号的含义),因此只需要证明 \(1,3\) 的正确性。
我们不妨假设表述 \(1\) 正确,其详细的证明如下,这里默认折叠了,但这个证明手段是比较重要的。
Proofs.
有很多证明方式,这里用几何的办法证明,因为后面别的地方还能用上,一拳打爆全部。
我们考虑把 \((i, S_i)\) 放在坐标系上刻画,位置始终在 \(x\) 轴上方,最后一步抵达 \(y=1\) 的位置。

图为序列 \((1, 4, -5, 3, -2, 0)\) 的刻画。
循环这个序列,由于总和为一,每经过 \(n\) 个位置,图像就会向上平移一格,观察发现可以用 \(k=1/n\) 的直线夹住这个图像。
以此为动机,我们开始严格的证明。
令 \(D_m = S_m - {m \over n}\),即每个点与 \(y= \frac{1}{n} x\) 的距离,显然 \(D\) 是以 \(n\) 为周期的。
我们说明一个周期里 \(D\) 互不相同,就能说明被直线切到的最低点唯一。
这里使用反证法,设 \(D_i = D_j\),得到 \(S_j - S_i = \frac{j - i}{n}\),左侧是整数,右侧不是整数,矛盾了,反证完成。
接下来说明存在性,以被切到的最低点 \(m\) 作为循环位移起点,始终有 \(D_{j} \gt D_{m}\),可以得到 \(S_j \gt \frac{j}{n} > 0\)。
也就是说,我们验证了以 \(m\) 开头的循环位移确实是合法的。
唯一性也容易说明,切线向上移动的话,设切到点 \(p\),显然此时前缀和 \(S'_m = S_m - S_p \le 0\),不论 \(p\) 在 \(m\) 的左右哪侧。
得证。
表述 \(3\) 可以使用表述 \(1\) 证明:
考虑表述 \(1\) 的情形,称后缀和为 \(T_i\),那么 \(T_1 = 1\),且 \(T_i = S_n - S_{i-1} = 1 - S_{i-1}\)。
由于总是有 \(S_i \gt 0\),可以推出 \(T_i \le 0\)。
其实就是说,对于表述 \(1\) 里一个合法的循环位移,我们把它反过来看就能得到表述 \(3\)。
而每个序列当然存在反着的序列,这样就说明了双射。
扩展 Raney 引理
对于长为 \(n\) 的整数序列:
表述 1:满足 \(S_n = 1\),则对每个 \(1 \le k \le n\),有且仅有一个循环位移满足:恰有 \(k\) 个 \(i\) \((1 \le i \le n)\) 使得 \(S_i \gt 0\);
表述 2:满足 \(S_n = -1\),则对每个 \(1 \le k \le n\),有且仅有一个循环位移满足:恰有 \(k\) 个 \(i\) \((1 \le i \le n)\) 使得 \(S_i \lt 0\);
表述 3:满足 \(S_n = 1\),则对每个 \(0 \le m \lt n\),有且仅有一个循环位移满足:恰有 \(m\) 个 \(i\) \((1 \le i \lt n)\) 使得 \(S_i \le 0\);
表述 4:满足 \(S_n = -1\),则对每个 \(0 \le m \lt n\),有且仅有一个循环位移满足:恰有 \(m\) 个 \(i\) \((1 \le i \lt n)\) 使得 \(S_i \ge 0\)。
考虑证明表述 \(1\):
我们前面证明了每个 \(D_i\) 各不相同,于是我们将直线切到最小值,次小值... 作为起点时:
位于新的横轴上方的点数显然会遍历 \(n, n-1, \dots, 1\)。
也就是说,原始的 Raney 引理只说了 1/n 句话(捧腹大笑)。
循环引理 Cycle Lemma
对于长为 \(n\) 的整数序列:
表述 1:满足 \(a_i \le 1\),且 \(S_n = k\),则恰有 \(k\) 个循环位移满足 \(S_i \gt 0\) \((1 \le i \le n)\);
表述 2:满足 \(a_i \ge -1\) 且 \(S_n = -k\),则恰有 \(k\) 个循环位移满足 \(S_i \lt 0\) \((1 \le i \le n)\);
表述 3:满足 \(a_i \le 1\) 且 \(S_n = k\),则恰有 \(k\) 个循环位移满足 \(S_i \lt k\) \((1 \le i \lt n)\);
表述 4:满足 \(a_i \ge -1\) 且 \(S_n = -k\),则恰有 \(k\) 个循环位移满足 \(S_i \gt -k\) \((1 \le i \lt n)\)。
这里说明表述 \(1\) 的原理:
怎么理解呢,类似 Raney 引理的证明,每经过一个周期会向上平移 \(k\),而我们 \(a_i \le 1\) 每次至多加一,导致直线会同时切到 \(k\) 个位置。
这样一来,选择每个切点作为起点,都可以得到一个合法的循环位移。
注:CPCer、OIer 里流传最广的名称是“广义 Raney 引理”,靠,但我感觉限制变多了,不太广义啊。
和卡特兰数的关系
考虑如何刻画合法的一个括号序列?我们称左括号为 \(1\),右括号为 \(-1\),前缀和为 \(S_i\)。
序列合法的充要条件是 \(S_i \ge 0\) 且 \(S_n = 0\),而由 \(n\) 对括号构成的合法括号序列数为 \(C_n\) 卡特兰数。
接下来,我们考察所有出现了 \(n+1\) 个 \(1\) 以及 \(n\) 个 \(-1\) 的序列 ,这样的序列共有 \(\binom{2n+1}{n}\) 种。
我们按循环同构的标准对这些序列分组(如果循环同构则分为一组),可以分出 \({1 \over {2n+1}} \binom{2n+1}{n}\) 组。
根据 Raney 引理,每组中恰有一个序列,满足所有前缀和严格大于 \(0\)。猜测括号序列与这种序列两者的关系是双射。
- 我们可以给一个合法的括号序列(满足 \(S_i \ge 0\) 且 $ S_n = 0$),在最左侧加入一个左括号 \(1\),此时这个括号序列满足 \(S_i \gt 0\) 且 $ S_n = 1$。
我们这样就把括号序列映射到了 Raney 引理上。 - 接下来考虑构造 Raney 引理到括号序列的映射,由于所有前缀和都是大于 \(0\) 的,所以所有合法序列的第一个数必然是 \(1\),
移除首项后,就得到了新序列,其满足括号序的要求。
这样我们就在 \(\pm 1\) 的序列上构造了双射。
也就用另一种方式验证了这个等式成立(当然直接展开就能知道是一样的)。
k-Dyck 路 / Fuss-Catalan 数
注意:这里的 \(k\) 在不同的文章里会出现差 \(1\) 的情况,本文认为普通卡特兰数对应了 \(k = 2\) 的情况,表示 \(k\) 叉树的方案数,形式上也更好看一点。
我们这样定义 \(k\)-Dyck 路:长度为 \(kn\) 的序列,其中只出现了 \(1\) 和 \(-(k-1)\),总和为 \(0\) 且总是有 \(S_i \ge 0\)。
因为步数固定,可以解方程得出,会向上走 \((k-1)n\) 步,以及向下走 \(n\) 步,共 \(kn\) 步。
接下来为了利用 Raney 引理,我们故技重施,在所有序列的最前面增加一个 \(1\),这样总和变为 \(1\),且 \(S_i \gt 0\)。
想知道有多少种序列呢(无论合法)。相当于在 \(kn+1\) 个位置中,挑出 \(n\) 个位置放置负数,即 \(\binom{kn+1}{n}\)。
此时使用 Raney 引理,就得到了下式(现在知道下式中 \(+1\) 的一种解释方式了?咔咔咔):
和前文一样,我们也可以通过删掉 \(1\) 来说明这是一个双射,就得出了 \(k\)-Dyck 路 / Fuss-Catalan 数的公式 \(C(n,k)\)。
一个众所周知的例子是恰有 \(kn+1\) 个节点,构成 \(k\) 叉树的方案数:
- 每次进入一个非叶节点,产生了 \(k\) 个槽位,但自己本身填了一个槽位,净 \(+(k-1)\) 个槽位。
- 每次进入叶节点,净 \(-1\) 个 槽位。
- 注: 也就说明了其中必有 \((k-1)n + 1\) 个叶节点。
可能会困惑为啥是 \(kn+1\) 多了一个节点,这是因为初始情况下,为了放下根节点,原始就有 \(1\) 的槽位。
这部分再讲下去比较难,也不见得非要说是 Raney 引理,感兴趣的可以阅读 2019 年集训队论文《浅谈格路计数相关问题》。
例题
我梦里的题 3(不是题)
给定长度为 \(n\) 的序列 \(a\),满足 \(\sum a_i = 1\),令 \(S_i\) 表示其前缀和。
问是否存在循环位移,满足恰有 \(k\) 个 \(i\) \((1 \le i \le n)\) 使得 \(S_i \gt 0\);
对 \(k = 1,2 \dots n\) 回答循环位移的起点下标,或者报告无解。
\(1 \le n, |a_i| \le 10^5\)
钩直饵咸啊。也不会无解。
扩展 Raney 引理的证明是构造性的,按 \(S_i - i/n\) 从小到大排序后输出即可,注意不要用小数,不然我会把数据范围改成 1e9(怒)。
卡特兰卷积 1
对于所有满足长度恰为 \(M\),且 \(\sum a_i = N\) 的 正整数 序列 \(a\):
计算它们 \(\prod_{i = 1}^{M} C_{a_i}\) 的加和,模一个大质数,其中 \(C_x\) 表示卡特兰数的第 \(x\) 项。
\(1 \le N,M \le 10^5\)
难不倒大家,直接拉格朗日反演就可以了对吧。且慢,没有这个必要!
原式等价于求:把 \(M\) 个非空的合法括号序列拼起来,合成总长为 \(2N\) 的序列,有多少种方案。
我们在每个括号序列前都插入一个 \(+1\),问题就转化为:序列由 \(N+M\) 个 \(+1\) 和 \(N\) 个 \(-1\) 构成,所有前缀和 \(S_i \gt 0\),求方案数。
嗨嗨,循环引理 Cycle Lemma 来啦,答案是:
也就是说,我们称卡特兰数的普通生成函数为 \(C(x) = \sum_{i=0}^{\infty} C_i x^i\)。
Cycle Lemma 告诉了我们怎么直接求出 \([x^n] C(x)^k\)(用 \(k\) 个非空括号序列拼起来,恰有 \(n\) 对括号的方案) 的值,即本题答案。
卡特兰卷积 2020
有 \(N\) 个相互间区分的盒子,你可以在每个盒子里放一个合法的括号序列,满足:
- 每个盒子内的序列长度不能恰为 \(2K\);
- 所有盒子的序列总长加起来为 \(2M\)。
求方案数,模一个大质数。数据范围 \(1 \le N,M,K \le 10^6\)。
和前面的题目几乎一样。考虑单个盒子的生成函数 \(F(x) = C(x) - C_K x^K\),欲求
恰好有两项,可以用二项式定理展开:
把后面的 \(j\) 次方拆了,让 \(x\) 无关的 \(C_k\) 移动:
提取系数的运算具有线性性:
把乘的 \(x^{jK}\) 塞到提取系数里去:
因为化简后的式子里有些限制,这里求和上界可以写成 \(\min(N, M/K)\)。
这样就做完了,如果不会求 \([x^a]C(x)^b\) 的话请看上一题的 Cycle Lemma。
yukicoder 13022
你需要回答满足以下条件的序列 \((a,b)\) 对数,对大质数取模。
- 长为 \(n\) 的非负序列 \(a\) 总和为 \(P\)
- 长为 \(n\) 的非负序列 \(b\) 总和为 \(Q\)。
- 对 \(1 \le m \le n\) 都有 \(Q \sum_{i=1}^m a_i = P \sum_{i=1}^m b_i\)
对 \(n = 1, 2 \dots N\) 都要回答。
数据范围特殊:\(1 \le N,P,Q \le 5 \times 10^5\),保证 \(\gcd(P,Q) = 1\)。
比较难的习题。
题目还有很多啊,以后补一些。有一些众所周知的题目,这里就仅列举一下:

浙公网安备 33010602011771号