Catalan数
Catalan数
假设我们有n个1和m个-1,我们希望排列这n+m个数,并且要求排列ai满足下面条件:
- 对于任意0≤j≤n+m,都有∑i≤jai≥−k。
我们希望求出有多少种不同的排列满足条件。
首先如果m>n+k,那么有效排列数一定为0。下面仅考虑m≤n+k的情况。
我们知道总共的排列数为(n+mn),因此只要减去不满足条件的排列数,就可以得到满足的排列数了。下面我们考虑怎么计算不满足条件的排列数。
对于某个不满足条件的排列B,一定能找到最小的下标,一定能找到最小的下标j,使得,使得∑i≤jai=−(k+1)。我们将排列。我们将排列B的从第的从第j+1个下标开始的值全部取相反值,即改为,改为。这样我们就得到了一个个下标开始的值全部取相反值,即1改为−1,−1改为1。这样我们就得到了一个m−1−k个和个1和n+1+k个的排列。要还原,我们只需要找到最小的下标个-1的排列。要还原,我们只需要找到最小的下标j,使得,使得∑i≤jai=−(k+1),将后面的元素取反就好了。这似乎暗示了,将后面的元素取反就好了。这似乎暗示了n个和个1和m个的无效排列与个−1的无效排列与m−1−k个和个1和n+1+k个的排列之间存在类似双射的关系。首先很明显从前者到后者一定是单射,即不同的输入对应不同的输出,同时由于个−1的排列之间存在类似双射的关系。首先很明显从前者到后者一定是单射,即不同的输入对应不同的输出,同时由于m−1−k个和个1和n+1+k个的排列中必定能找到这样的个−1的排列中必定能找到这样的j,使得前j个数的和为−(k+1),因此映射是满射。
满射意味着n个1和m个−1的无效排列与m−1−k个1和n+1+k个-1的排列数目相同,即总有效排列数为:
(n+mn)−(n+mn+1+k)问题1:用n个左括号和n个右括号能组成多少有效的括号序列。
首先一个括号序列有效,当且仅当排列中所有前缀部分中,左括号数不少于右括号数。如果我们将左括号视作1,右括号视为-1,取k=0,那么就转换为Catalan数问题了。有效数为
(2nn)−(2nn+1)问题2:给定一个n⋅n的网格,我们从(0,0)出发。假如我们现在位于(i,j),且i<n,那么我们下一步可以到达(i+1,j−1),(i+1,j),(i+1,j+1)。问最后停止在(n,k)的总方案数有多少,这里l≤k≤r。其中n≤105,结果模上某个素数p
这个问题利用了catalan数的一个特性,设m为向上走的次数和向下走的次数的总和,记x表示向上走的次数,那么x一定符合:l≤x−(m−x)≤r,即⌈m+l2⌉≤x≤⌊m+r2⌋。可以发现:
⌊m+r2⌋∑x=⌈m+l2⌉[(mx)−(mx+1)]=(m⌈m+l2⌉)−(m⌊m+r2⌋+1)而我们只需要枚举m即可得到所有的可能:
n∑m=0[(m⌈m+l2⌉)−(m⌊m+r2⌋+1)](nm)上面的公式可以O(n)计算。
提供一道CF类似的题目(但是是毒瘤题,需要使用扩展卢卡斯定理求组合数)。