卡特兰数

卡特兰数

一、计算公式

\(C_1 = 1\), \(C_n = C_{n - 1} \frac{4n - 2} {n + 1} = C_{2n}^{n} - C_{2n}^{n + 1} = \frac {C_{2n}^n} {n + 1}\)

二、应用场景

场景1

n 个元素进栈序列为:1,2,3,4,...,n,则有多少种出栈序列?

将进栈表示 +1,出栈表示为-1。要想是合法序列,则 +1的数量要大于等于-1。

场景2

n 对括号,则有多少种 括号匹配 的括号序列?

场景3

给定 n 个0 和 n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排列成的所有序列中,能够满足任意前缀序列中0的个数都不少于 1 的个数的序列有多少个。答案对 \(10^9+7\)​取模

情景4

8 个高矮不同的人需要排成两队,每队 4 个人。其中,每排都是从低到高排列,且第二排的第 i 个人比第一排中第 i 个人高,则有多少种排队方式。

情景5

电影票一张 50 coin,且售票厅没有 coin。m 个人各自持有 50 coin,n 个人各自持有 100 coin!

则有多少种排队方式,可以让每个人都买到电影票。

注:必须先让持有50 coin的人买票,然后才能有钱找给持有100 coin的人

如果考虑不同的人顺序的话,答案为\((C_{m + n}^{m} - C_{m + n}^{m + 1}) * m! * n!\)

三、证明

引用链接:https://www.acwing.com/solution/content/8907/
感谢番茄酱
image

四、求卡特兰数

MOD = 10 ** 9 + 7
def exgcd(a,b):
    if b == 0:
        return 1,0,a
    x,y,gcd = exgcd(b,a % b)
    x,y = y,(x - (a // b) * y)
    return x,y,gcd
def inv(x):
    o,_,_ = exgcd(x,MOD)
    return o % MOD
n = int(input())
ans = 1

for i in range(2,n + 1):
    ans = (ans * (4 * i - 2) * inv(i + 1)) % MOD
print(ans % MOD)
posted @ 2024-04-03 20:15  gebeng  阅读(106)  评论(0)    收藏  举报