卡特兰数及其应用

牛客:あなたの蛙が帰っています

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(n1)+h(1)h(n2)++h(n1)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(n1)n+14n2
  • 公式三
    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} C2nnC2nn1

卡特兰数的应用场景

  • 给定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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值