acwing算法基础之数学知识--求卡特兰数

目录

  • [1 基础知识](#1 基础知识)
  • [2 模板](#2 模板)
  • [3 工程化](#3 工程化)

1 基础知识

题目:给定n个0和n个1,它们将按照某种顺序排成长度为2n的序列,求它们能排成的所有序列中,能够满足任意前缀序列中0的个数都不少于1的个数的序列有多少个?

输出的答案对 1 0 9 + 7 10^9+7 109+7取模。

原题目等价于,

在平面直角坐标系xoy下,起点为(0,0),终点为(n,n),每次只能向上走一格或向右走一格,问从起点走到终点,且路径上横坐标大于等于纵坐标恒成立,求有多少种走法?

用下图表示即为,

在不触碰到红线(即 y = x + 1 y=x+1 y=x+1)的情况下,从起点(0,0)走到终点(n,n),有多少种走法。

考虑一种触碰到红线,走到终点(n,n)的路径,如下图粗蓝色所显示路径。我们将从首次触碰到红线的点,记作红点。那么,将接下来的路径按照红线( y = x + 1 y=x+1 y=x+1)对称,可以得到粗绿色所显示路径,最终走到点(n-1,n+1)。

也就是说,任何一条触碰红线,走到终点(n,n)的路径,都可以等效成,一条走到(n-1,n+1)的路径。而从起点走到点(n-1,n+1)的路径数为 C 2 n n − 1 C_{2n}^{n-1} C2nn−1,故触碰红线走到终点的路径数目为 C 2 n n − 1 C_{2n}^{n-1} C2nn−1。

题目要计算的是,不触碰红线走到终点(n,n)的路径数目,它等于总路径数目减去触碰红线走到终点(n,n)的路径数目,即答案可计算如下,
C 2 n n − C 2 n n − 1 = ( 2 n ) ! n ! ⋅ n ! − ( 2 n ) ! ( n − 1 ) ! ⋅ ( n + 1 ) ! C_{2n}^n-C_{2n}^{n-1}=\frac{(2n)!}{n!\cdot n!} - \frac{(2n)!}{(n-1)!\cdot (n+1)!} C2nn−C2nn−1=n!⋅n!(2n)!−(n−1)!⋅(n+1)!(2n)!
= ( 2 n ) ! ( n − 1 ) ! ⋅ n ! ⋅ ( 1 n − 1 n + 1 ) = ( 2 n ) ! ( n − 1 ) ! ⋅ n ! ⋅ 1 n ( n + 1 ) =\frac{(2n)!}{(n-1)!\cdot n!}\cdot (\frac{1}{n} - \frac{1}{n+1})=\frac{(2n)!}{(n-1)!\cdot n!}\cdot \frac{1}{n(n+1)} =(n−1)!⋅n!(2n)!⋅(n1−n+11)=(n−1)!⋅n!(2n)!⋅n(n+1)1
= ( 2 n ) ! n ! ⋅ n ! ⋅ 1 n + 1 = C 2 n n n + 1 =\frac{(2n)!}{n!\cdot n!} \cdot \frac{1}{n+1}=\frac{C_{2n}^n}{n+1} =n!⋅n!(2n)!⋅n+11=n+1C2nn

其中 C 2 n n n + 1 \frac{C_{2n}^{n}}{n+1} n+1C2nn即为卡特兰数。

转换为代码,如下,

cpp 复制代码
#include <iostream>

using namespace std;

const int mod = 1e9 + 7;

int qmi(int a, int k, int p) {
    int res = 1;
    while (k) {
        if (k & 1) res = (long long)res * a % p;
        k >>= 1;
        a = (long long)a * a % p;
    }
    return res;
}

int main() {
    int n;
    cin >> n;
    
    //计算C[2 * n][n] / (n + 1) % mod
    int res = 1;
    for (int i = 1, j = 2 * n; i <= n; ++i, --j) {
        res = (long long)res * j % mod;
        res = (long long)res * qmi(i, mod - 2, mod) % mod;
    } 
    res = (long long)res * qmi(n + 1, mod - 2, mod) % mod;
    cout << res << endl;
    return 0;
}

2 模板

暂无。。。

3 工程化

暂无。。。

相关推荐
船厂电气自动化ai大模型1 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光1 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒1 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
hy.z_7772 小时前
【C++】13. 继承
c++
汉字萌萌哒2 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院2 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
2401_890603403 小时前
C++ 继承
c++
zlinear数据采集卡3 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴3 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
果果燕3 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++