Catalan数

Published: by Creative Commons Licence

  • Tags:

Catalan数

假设我们有n个1和m个-1,我们希望排列这n+m个数,并且要求排列ai满足下面条件:

  • 对于任意0jn+m,都有ijaik

我们希望求出有多少种不同的排列满足条件。

首先如果m>n+k,那么有效排列数一定为0。下面仅考虑mn+k的情况。

我们知道总共的排列数为(n+mn),因此只要减去不满足条件的排列数,就可以得到满足的排列数了。下面我们考虑怎么计算不满足条件的排列数。

对于某个不满足条件的排列B,一定能找到最小的下标,一定能找到最小的下标j,使得,使得ijai=(k+1)。我们将排列。我们将排列B的从第的从第j+1个下标开始的值全部取相反值,即改为,改为。这样我们就得到了一个个下标开始的值全部取相反值,即1改为11改为1。这样我们就得到了一个m1k个和个1n+1+k个的排列。要还原,我们只需要找到最小的下标个-1的排列。要还原,我们只需要找到最小的下标j,使得,使得ijai=(k+1),将后面的元素取反就好了。这似乎暗示了,将后面的元素取反就好了。这似乎暗示了n个和个1和m个的无效排列与个1的无效排列与m1k个和个1n+1+k个的排列之间存在类似双射的关系。首先很明显从前者到后者一定是单射,即不同的输入对应不同的输出,同时由于个1的排列之间存在类似双射的关系。首先很明显从前者到后者一定是单射,即不同的输入对应不同的输出,同时由于m1k个和个1n+1+k个的排列中必定能找到这样的个1的排列中必定能找到这样的j,使得前j个数的和为(k+1),因此映射是满射。

满射意味着n1m1的无效排列与m1k个1和n+1+k个-1的排列数目相同,即总有效排列数为:

(n+mn)(n+mn+1+k)

问题1:用n个左括号和n个右括号能组成多少有效的括号序列。

首先一个括号序列有效,当且仅当排列中所有前缀部分中,左括号数不少于右括号数。如果我们将左括号视作1,右括号视为-1,取k=0,那么就转换为Catalan数问题了。有效数为

(2nn)(2nn+1)

问题2:给定一个nn的网格,我们从(0,0)出发。假如我们现在位于(i,j),且i<n,那么我们下一步可以到达(i+1,j1),(i+1,j),(i+1,j+1)。问最后停止在(n,k)的总方案数有多少,这里lkr。其中n105,结果模上某个素数p

这个问题利用了catalan数的一个特性,设m为向上走的次数和向下走的次数的总和,记x表示向上走的次数,那么x一定符合:lx(mx)r,即m+l2xm+r2。可以发现:

m+r2x=m+l2[(mx)(mx+1)]=(mm+l2)(mm+r2+1)

而我们只需要枚举m即可得到所有的可能:

nm=0[(mm+l2)(mm+r2+1)](nm)

上面的公式可以O(n)计算。

提供一道CF类似的题目(但是是毒瘤题,需要使用扩展卢卡斯定理求组合数)。