卡特兰数

卡特兰数

  • 通项公式1:(h(n) = frac{1}{n + 1}C_{2n}^n = C_{2n}^n - C_{2n}^{n - 1})
  • 通项公式2:(h(n) = frac{1}{n + 1}sum_{i = 0}^n(C_n^i)^2)
  • 递推公式1:(h(n) = frac{4n - 2}{n + 1}h(n), h(0) = 1)
  • 递推公式2:(h(n + 1) = sum_{i = 0}^nh(i)h(n - i),h(0) = 1)

问题:从((0,0))((n,n)),每次只能向右或向上走,且不能超过对角线,求走法个数

img

进出栈 - 括号匹配

有n个数字顺序入栈,求有几种进出栈的顺序

电影购票

电影票50元,如果有m + n个人排队买票,其中m个人各持有50元面值的钞票1张,而另外n个人各持有100元面值的钞票1张。票房没有预备找零,求有多少种方法可以将这m + n个人排成一列,顺序购票,使得都能买到票

圆内连弦

圆周上有2n个点,以这些点为端点连互不相交的n条弦,求不同的连法总数

图8 圆内连弦不交问题

凸多边形的剖分

求凸(n + 2)变形用其(n - 1)条对角线分割为互不重叠的三角形的分法总数

QQ20151105-11

模板

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
const int mod = 998244353;
ll h[N], inv[N];
void solve(int N, int p){
    h[0] = 1;
    inv[1] = 1;
    for(int i = 2; i <= N; ++ i)
        inv[i] = (ll)(p - p / i) * inv[p % i] % p;//加上p为了防止变成负数
    
    for(int i = 1; i <= N; i++)
        h[i] = h[i - 1] * (4 * i - 2) % mod * inv[i + 1] % mod;
}
int main(){
    int t, n;
    cin >> t;
    solve(N - 1, mod);
    for(int i = 1; i <= t; i++){
        scanf("%d", &n);
        printf("Case #%d: %lld
", i, h[n]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Emcikem/p/11342326.html