卡特兰数
一、计算公式
\(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/
感谢番茄酱
四、求卡特兰数
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)
标签:ans,序列,2n,coin,卡特兰,MOD
From: https://www.cnblogs.com/gebeng/p/18113443