Catalan递推式
- 公式一
h ( 0 ) = 0 , h ( 1 ) = 1 h ( n ) = h ( 0 ) ⋅ h ( n − 1 ) + h ( 1 ) ⋅ h ( n − 2 ) + ⋯ + h ( n − 1 ) ⋅ h ( 0 ) h(0)=0,h(1)=1\\ h(n)=h(0) \cdot h(n-1)+h(1) \cdot h(n-2)+\cdots+h(n-1)\cdot h(0) h(0)=0,h(1)=1h(n)=h(0)⋅h(n−1)+h(1)⋅h(n−2)+⋯+h(n−1)⋅h(0)
- 公式二
h ( n ) = h ( n − 1 ) ⋅ 4 n − 2 n + 1 h(n)=h(n-1)\cdot \frac{4n-2}{n+1} h(n)=h(n−1)⋅n+14n−2 - 公式三
C 2 n n n + 1 \frac{C_{2n}^{n}}{n+1} n+1C2nn - 公式四
C 2 n n − C 2 n n − 1 C_{2n}^{n}-C_{2n}^{n-1} C2nn−C2nn−1
卡特兰数的应用场景 |
- 给定n个数,有多少种出栈序列?
- 一个栈的进栈序列为1,2,3,…n,有多少个不同的出栈序列?
- P=A1A2A3……An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
- n个节点的二叉树有多少种形状?
- 有n+1个叶子的满二叉树的个数?
- 在n*n的格子中,只在下三角行走,每次横或竖走一格,有多少中走法?
- 将一个凸n+2边形区域分成三角形区域的方法数?
- 在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
- 用n个长方形填充一个高度为n的阶梯状图形的方法个数?
- 由n个 +1 和n个 -1 组成的排列中,满足前缀和大于等于0的排列数?
- 对于在n位的二进制中,有m个0,其余为1的Catalan数为:C(n,m)-C(n,m-1)
当n小于35时,可以用long long来存储,否则会溢出
typedef long long LL;
LL h[35];
void Init(){
h[0] = 1;
for(int i = 1; i < 35; i++){
h[i] = h[i-1] * (4 * i - 2) / (i + 1);
}
}
取模版本(快速幂 + 逆元)
typedef long long LL;
const int maxn = 1e5 + 50;
const int MOD = 998244353;
LL f[maxn],inv[maxn];
LL quick_pow(LL a,LL b){
LL ans = 1;
while(b){
if(b & 0x1) ans = (ans * a) % MOD;
a = (a * a) % MOD;
b >>= 1;
}
return ans;
}
void Init(){
f[0] = inv[0] = 1;
for(int i = 1;i < maxn; i++){
f[i] = f[i - 1] * i % MOD;
inv[i] = quick_pow(f[i],MOD - 2);
}
}
LL C(int m,int n){
return f[m] * inv[m - n] % MOD * inv[n] % MOD;
}
int Catalan(int n){
return (C(2 * n , n) - C(2 * n , n - 1) + MOD) % MOD;
}