卡特兰数

卡特兰数——Catalan number

一笑奈何 提交于 2019-11-30 19:41:00
卡特兰数的百度百科链接 卡特兰数的维基百科链接 在学习数据结构的 栈 的 合法输出序列 时,我发现栈的合法输出序列的计算公式居然是著名的Catalan number,然后找了些资料学习了一下。 Catalan number 一般项公式 在解决计数问题时,我们常会遇到卡特兰数,卡特兰数的一般项公式为: 递推公式 卡特兰数满足的递推公式为(这也是计算栈的合法输出序列的公式): 前20项的值 前20项为(OEIS中的数列A000108):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190 来源: CSDN 作者: NO_tomato 链接: https://blog.csdn.net/qq_40514690/article/details/100165240

卡特兰数

你。 提交于 2019-11-30 19:40:31
定义 f ( 0 ) = 1 , f ( 1 ) = 1 //--> f ( n ) = Σ f ( i ) ∗ f ( n − i − 1 ) , n > = 2 , n ∈ Z //--> 前几项:1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900… 常见形式 1.二叉树的计数 已知一颗二叉树有n个节点,问该二叉树有多少种形态? 除去根节点,左子树和右子树共有n-1个节点,左子树和右子树的方案又是相同的问题。令n个节点的二叉树形态总数为f(n),设左子树有i个节点,则右子树有n-i-1个节点,那么: f ( n ) = Σ f ( i ) ∗ f ( n − i − 1 ) //--> 即卡特兰数第n项。 2.AB排列问题 有一个由n个A和n个B组成的2*n的序列,满足从第一个位置开始到任何位置,B的个数都不超过A的个数。 将A视为+1,B视为-1,那么这个序列就像一个一上一下的函数图像: 从0出发,由于有n个A和n个B,所以最后肯定会走回0,又因为B的个数都不超过A的个数,所以不可能走到0以下(ps:下文把走两次称作1步)。 令走n步的方案数为f(n),设第二次走到0的点为i(第一次走到0的点是0,但是i可以是0),那么就可以将走n步分为两部分:先走到i,然后在i选A(+1)(因为走到i时为0,那么i必须选A(

卡特兰数详解

别来无恙 提交于 2019-11-30 19:40:20
目录 关于卡特兰数: 计算公式 一般性质 代码实现: 关于卡特兰数: 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786…… 计算公式 卡特兰数一般的计算公式: 另类递推公式:C(n)=C(n-1)*((4*n-2)/(n+1)); 一般性质 Cn的另一个表达形式为 所以,Cn是一个自然数,这一点在先前的通项公式中并不显而易见。 这个表达形式也是André对前一公式证明的基础。 卡塔兰数满足以下递推关系 它也满足 这提供了一个更快速的方法来计算卡塔兰数。 所有的奇卡塔兰数Cn都满足n = 2^k − 1。 所有其他的卡塔兰数都是偶数。 代码实现: int main() { ios::sync_with_stdio(false); long long Catalan[100],ans;//范围自行高精度或者取模 int n; Catalan[0] = 1; for(int i = 1;i < n;++i) Catalan[i] = Catalan[i - 1] * i; while(cin >> n){ ans = Catalan[n << 1] / (Catalan[n] * Catalan[n + 1]); cout << ans << endl; }

卡特兰数的递推公式推导

走远了吗. 提交于 2019-11-30 19:40:06
今天做acm题时碰到了卡特兰数,于是就上百度查了卡特兰数的解释,其中有这么一段: 出栈次序 一个 栈 (无穷大)的 进栈 序列为1,2,3,…,n,有多少个不同的 出栈 序列? 常规分析 首先,我们设f(n)=序列个数为n的出栈序列种数。同时,我们假定,从开始到栈第一次出到空为止,这段过程中第一个出栈的序数是k。特别地,如果栈直到整个过程结束时才空,则k=n 首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。 此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。 看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)(n=0,1,2,……)。 最后,令f(0)=1,f(1)=1。 其中提到首次出空之前第一个出栈的序数k,k把序列分成了1~k-1和k+1~n两个部分,把k作为序数时f(n)=f(k-1

卡特兰数汇总

空扰寡人 提交于 2019-11-30 19:36:00
本文总结了来自网上卡特兰数的各种递推公式,以及卡特兰数、卡特兰大数取模的代码实现,最后再顺带提一下卡特兰数的几个应用。 什么是卡特兰数呢?卡特兰数无非是一组有着某种规律的序列。重要的是它的应用。 卡特兰数前几项为 : 1 , 1 , 2 , 5 , 14 , 42 , 132 , 429 , 1430 , 4862 , 16796 , 58786 , 208012 , 742900 , 2674440 , 9694845 , 35357670 , 129644790 , 477638700 , 1767263190 , 6564120420 , 24466267020 , 91482563640 , 343059613650 , 1289904147324 , 4861946401452 , . . . 下面给出几个求卡特兰数的公式,用inv(n)表示卡特兰数的第n项,其中inv(0)=1,inv(1)=1 公式一:inv(n)= inv(0)*inv(n-1)+inv(1)*inv(n-2) + ... + inv(n-1)*..inv(0) (n>=2) 公式二:inv(n)=inv(n-1)*(4*n-2)/(n+1) 公式三:inv(n)=C(2n,n)/(n+1) (n=0,1,2,...) 公式四:inv(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...

卡特兰数讲解

老子叫甜甜 提交于 2019-11-30 19:32:51
来源 卡特兰数 关于扩展的卡特兰数: 1.(n-m+1)/(n+1)*c(n+m,n) 2.c[n+m][n]-c[n+m][m-1] Catalan,Eugene,Charles,卡特兰(1814~1894)比利时数学家,生于布鲁日(Brugge),早年在巴黎综合工科学校就读。1856年任列日(Liege)大学数学教授,并被选为比利时布鲁塞尔科学院院士。 卡特兰一生共发表200多种数学各领域的论著。在微分几何中,他证明了下述所谓的卡特兰定理:当一个直纹曲线是平面和一般的螺旋面时,他只能是实的极小曲面。他还和雅可比(Jacobi,C·G·J)同时解决了多重积分的变量替换问题,建立了有关的公式。 1842年,他提出了一种猜想:方程x z -y t =1没有大于1的正整数解,除非平凡情形3 2 -2 3 =1。这一问题至今尚未解决。 (mathoe注:即除了8、9这两个连续正整数都是正整数的方幂外,没有其他。1962年我国数学家柯召以极其精湛的方法证明了不存在三个连续正整数,它们都是正整数的方幂,以及方程x 2 -y n =1,n>1,xy≠0无正整数解。并且还证明了如果卡特兰猜想不成立,其最小的反例也得大于10 16 。) 此外,卡特兰还在函数论、伯努利数和其他领域也做出了一定的贡献。 卡特兰通过解决凸n边形的剖分得到了数列C n 。 凸n+2边形用其n-1条对角线把此凸n

卡特兰数公式推导

坚强是说给别人听的谎言 提交于 2019-11-30 19:32:32
卡特兰数最常见的描述就是2n个球进站出站有多少种顺序 推导:折线法,问题转化为从 ( 0 , 0 ) 到 ( 2 n , 0 ) //--> 每次可以向右上或者右下走一波,问在不越过 y = 0 //--> 这条线的情况下,有多少种走法。 所以可以根据总数减去非法数 总数很明显是 c n 2 n //--> 非法数可以这样算。如果这个过程非法,这条线一定会碰到 y = − 1 //--> 这样我们可以取折线第一次喷到直线 y = − 1 //--> 的点。然后的折线对 y = − 1 //--> 做对称,这样所有的点最终都会汇聚到 ( 2 n , − 2 ) //--> 这样总数就有 C n − 1 2 n //--> 所以最终结果就是 c n 2 n − C n − 1 2 n //--> 化简后很容易得到 c n 2 n n + 1 //--> 来源: CSDN 作者: lyc1635566ty 链接: https://blog.csdn.net/lyc1635566ty/article/details/73744823

卡特兰数相关及通项公式简单证明

我与影子孤独终老i 提交于 2019-11-30 19:31:04
卡特兰数有两个递推公式,两个通项公式(或者说是一个): h n = ∑ i = 1 n − 1 h i h n − i h_n=\displaystyle\sum_{i=1}^{n-1} h_{i}h_{n-i} h n ​ = i = 1 ∑ n − 1 ​ h i ​ h n − i ​ h n = h n − 1 4 n − 2 n + 1 h_n=h_{n-1}\frac{4n-2}{n+1} h n ​ = h n − 1 ​ n + 1 4 n − 2 ​ h n = C 2 n n − C 2 n n − 1 h_n=C_{2n}^{n}-C_{2n}^{n-1} h n ​ = C 2 n n ​ − C 2 n n − 1 ​ h n = C 2 n n n + 1 h_n=\frac{C_{2n}^n}{n+1} h n ​ = n + 1 C 2 n n ​ ​ 用折线法证明通项公式: L L L 点即为第一次走过 y = x y=x y = x 的点,绿线和黄线组成了一条非法的路径 现在按照 y = x + 1 y=x+1 y = x + 1 对称,则绿线和蓝线构成了另一条路径 蓝线和黄线总是一一对应的,而蓝线走到的点总是 ( n − 1 , n + 1 ) (n-1,n+1) ( n − 1 , n + 1 ) 从原点到 A ′ A' A ′ 的方案数就是

卡特兰数(Catalan Number)

早过忘川 提交于 2019-11-30 08:28:42
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。该数在计算机专业中比较重要,有一些具体的应用实例。这篇文章主要分三部分: 卡特兰数递归式的含义解释 卡特兰数表达式的证明过程 卡特兰数的计算机中的应用 Catalan Number递归式解释 假设h(0)=1,h(1)=1,catalan数满足递推式: \[ h(n) = h(0)*h(n-1) + h(1)*h(n-2) + h(2)*h(n-3) + ... +h(n-1)*h(0) \tag{1.1} \] 递归式背后有什么物理含义呢,这里以出栈序列问题进行说明: 问题描述: 一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? 含义解释: 首先,我们设 \(h(n)\) =序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有 \(h(k-1)\) 种,而之后比k大的值入栈,且都在k之前出栈,因此有 \(h(n-k)\) 种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则, \(h(n-k)*h(k-1)\) 种,求和便是Catalan递归式。 Catalan

洛谷 P5564: [Celeste-B]Say Goodbye

女生的网名这么多〃 提交于 2019-11-29 18:22:54
题目传送门: 洛谷 P5564 。 题意简述: 有 \(n\) 个点,染 \(m\) 种颜色,第 \(i\) 种颜色染恰好 \(cnt_i\) 个节点,满足 \(cnt_1+cnt_2+\cdots+cnt_m=n\) 。 求这 \(n\) 个点组成的 本质不同 的 无标号 + 有序 (子树有序)基环(环长至少为 \(2\) )树个数。 两棵基环树本质相同当且仅当通过环的旋转(不能翻转)后能使得它们完全相同。 题解: 首先考虑只染一种颜色的 \(n\) 个点( \(n\ge1\) )的无标号有根有序树个数计数。 考虑这棵树的括号序,发现其括号序是长度为 \(n\) 的合法括号串,但是必须满足最外层括号(根节点)只有一对。 即 \(n\) 个点的有根有序树个数为 \(n-1\) 对括号组成的合法括号串,即第 \(n-1\) 个卡特兰数。 令 \(n\) 个点的有根有序树个数为 \(t_n\) ,令其 OGF 为 \(\displaystyle T=\sum_{i=1}^{+\infty}t_ix^i\) ,即 \(T=xC\) ,其中 \(C\) 为卡特兰数的 OGF。 再考虑染色的问题,不难发现只要有序,则染色和树形态是相互独立的。 即只要乘上一个多重组合数 \(\displaystyle\binom{n}{cnt_1,cnt_2,\ldots,cnt_m}\) 即可。 回到原问题