首页 > 其他分享 >卡特兰数

卡特兰数

时间:2023-07-24 21:22:33浏览次数:45  
标签:dbinom int Cat 2n 卡特兰 极长

概念

以下看似毫不相关的问题均属于 Catalan 数列:

  • \(n\) 个节点构成的无标号、区分左右儿子的二叉树数量为 \(Cat_n\)
  • \(n\) 个节点构成的无标号、区分儿子的有根树数量为 \(Cat_{n - 1}\)
  • \(n\) 个左括号与 \(n\) 个右括号组成的合法序列有 \(Cat_n\) 种
  • \(n\) 个元素按照大小进栈,合法的出栈序列有 \(Cat_n\) 种
  • 将凸 \(n\) 边形用 \(n - 3\) 条对角线将其分割为互不重叠的 \(n - 2\) 个三角形的方案数为 \(Cat_{n - 2}\)
  • 从 \((0,0)\) 出发,每次沿正方向走,到达 \((n,n)\) 且不接触直线 \(y=x\) 的路径数量为 \(Cat_n\)
  • 以圆上的 \(2n\) 个点为端点,连互不相交的 \(n\) 条弦的方案数为 \(Cat_n\)
  • 将 \(1 \sim 2n\) 中的数不重不漏地填入 \(2 \times n\) 的矩阵,每个数字大于其左边和上面数字的方案数 \(Cat_n\)

卡特兰序列的前几项为:

\(Cat_0\) \(Cat_1\) \(Cat_2\) \(Cat_3\) \(Cat_4\) \(Cat_5\) ...
\(1\) \(1\) \(2\) \(5\) \(14\) \(42\) ...

实现

关于卡特兰数的常见公式:

\[\begin{aligned} Cat_n &= \frac{\dbinom{2n}{n}}{n+1} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (n>2) \\ Cat_n &= \dbinom{2n}{n} - \dbinom{2n}{n - 1} \\ Cat_n &= \frac{Cat_{n-1}(4n-2)}{n+1} \\ Cat_n &= \begin{cases} \sum_{i = 1}^{n} Cat_{i - 1} \times Cat_{n-i} & (n>2) \\ 1 & (n=0,1) \end{cases} \\ \end{aligned} \]

应用

P1375 小猫

本题是求凸多边形三角划分,直接求 \(Cat_n\) 即可

\(1 \sim 2n\) 均匀分给 \(A, B\) 两人,排序后比较大小, \(A\) 大记 \(0\) , \(B\) 大记 \(1\) ,给定一个 \(01\) 串,求可能的分配方案数 \(\bmod 998244353\)

对于所有数据, \(1 \leq n \leq 10^5\)

对于一个极长连续 \(1\) 段,则对于任意一个前缀, \(B\) 所占有的数字均大于 \(A\) 所占有的数字,不难发现这可以转化为括号匹配的方案数,极长连续 \(0\) 段同理,答案即为每一个极长连续段的卡特兰数之积

#include <bits/stdc++.h>
using namespace std;
const int Mod = 998244353;
const int N = 1e5 + 7;

int cat[N], inv[N];
char s[N];

int n, ans = 1;

inline void init() {
	inv[0] = inv[1] = 1;
	
	for (int i = 2; i <= n + 1; ++i)
		inv[i] = 1ll * (Mod - Mod / i) * inv[Mod % i] % Mod;
	
	cat[0] = cat[1] = 1;
	
	for (int i = 2; i <= n; ++i)
		cat[i] = 1ll * cat[i - 1] * (4ll * i % Mod - 2) % Mod * inv[i + 1] % Mod;
}

signed main() {
	scanf("%d%s", &n, s + 1);
	init();
	
	for (int i = 1, pos = 1; i <= n; i = pos) {
		while (s[i] == s[pos] && pos <= n)
			++pos;
		
		ans = 1ll * ans * cat[pos - i] % Mod;
	}
	
	printf("%d", ans);
	return 0;
}

标签:dbinom,int,Cat,2n,卡特兰,极长
From: https://www.cnblogs.com/wshcl/p/17578392.html

相关文章

  • 卡特兰数
    卡特兰数定义卡特兰数非常常见,最为典型的就是给定n个1和n个0排列成为一个2n长度的01序列,要求对于任一个\(1\lek\le2n\)都有从第一个数到第k个数中0的个数都不少于1的个数。求法及其推导我们可以把这个01序列抽象成一个具体的问题:0代表向右走一步,1代表向上走一步,要求一共......
  • 浅谈斐波那契数列和卡特兰数
    斐波那契数列斐波那契数列是我们较为熟悉的一类数列了,在学习递归和递推的时候我们就已经能求解\(n\)较小的情况了;斐波那契数列的定义如下:\[\left\{\begin{matrix}F_{n}=0&n=0\\F_{n}=1&n=1\\F_{n}=F_{n-1}+F_{n-2}&n\ge2\end{matrix}\right.\]卢卡斯数列卢卡斯数列......
  • (hdu step 2.3.8)小兔的棋盘(卡特兰数:从左上角走到右上角的路径数)
    题目:     小兔的棋盘TimeLimit:1000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):802AcceptedSubmission(s):502ProblemDescription小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是......
  • 已知n个数的入栈序列,求一共有多少种出栈序列 (卡特兰数)
    已知\(n\)个数的入栈序列,求一共有多少种出栈序列这个经典问题有两种解法。解法一:设\(f(x)\)为\(x\)个数入栈后,再全部出栈的序列数量假设我们有\(4\)个数\(a,b,c,d\),我们来看\(a\)的出栈顺序.假如\(a\)第一个出栈,那么后面还有\(3\)个数没有出栈,因此方法数是\(f(3)\).假设\(......
  • 卡特兰数
    卡特兰数问题给定\(n\)个\(0\)和\(n\)个\(1\),它们将按照某种顺序排成长度为\(2n\)的序列,它们能排列成的所有序列中,能够满足任意前缀序列中\(0\)的个数都不少于\(1\)的个数的序列有多少个?转化我们将上面的问题进行转化:问:从\((0,0)\)点走到\((n,n)\)点,且只......
  • 数学知识3.2-卡特兰数
    一、卡特兰数卡特兰数:\(C_{2n}^{n}-C_{2n}^{n+1}=\frac{C_{2n}^{n}}{n+1}\)。卡特兰数满足递推公式:设\(C_n=\frac{C_{2n}^{n}}{n+1}\),\(C_1=1\),\(C_n=C_{n-1}\frac{4n-2......
  • 关于卡特兰数的若干讨论
    去年清明写的,现在补个档。基于序列的卡特兰数通项公式推导​ 卡特兰数可认为是一个长度为\(2n\)的合法栈序列之集合的势。换言之,亦即所有长度为\(2n\)的仅由\(-1\)......
  • 卡特兰数学习笔记
    参考了这篇博客引入\(n\)个元素进栈序列为:\(1,2,3,4...n\),求总共有多少种出栈序列。将进栈表示为\(+1\),出栈表示为\(-1\),则\(1,3,2\)的出栈序列可以表示为:\(+1,-1,......
  • HDU/HDOJ 2067 小兔的棋盘 DP/卡特兰数
    HDU/HDOJ2067小兔的棋盘小兔的棋盘TimeLimit:1000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):12782    Acce......
  • 卡特兰数
    卡特兰数:$C(n)=\binom{2n}{n}-\binom{2n}{n+1}=\frac{\binom{2n}{n}}{n+1}$几何表示:卡特兰数表示从点O到点A,只能向上或向右走蓝色线段的方案数,即从点O到点A,只能向上或......