一.公式

卡特兰数一般公式

  令h(0)=1,h(1)=1,catalan数满足递推式。h(n) = h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)。也就是说,如果能把公式化成上面这种形式的数,就是卡特兰数

组合公式

  Cn = C(2n,n) / (n+1)

  (化简前 h(n) = c(2n,n)-c(2n,n+1) (n=0,1,2,...) 证明)

递归公式1

  h(n) = h(n-1)*(4*n-2) / (n+1)

递归公式2

  h(n) = ∑(i=0 to n-1) h(i)*h(n-i-1)

二.资料

  catalan---卡特兰数(小结)

三.某些题

1.在圆上选择2n个等间隔的点。证明将这些点成对连接起来使得所得到的n条线段不相交的方法数等于第n个Catalan数

设方法数为gn,分别将这些点用1,2,…,2n标记。取定点1,任选另一个偶数点2k,连接点1与点2k。该线段将圆分成K1和K2两部分。对K1,有k-1对点,故有gk-1种方法;对K2,有n-k对点,故有gn-k种方法。所以
   g0=1
   令hn=gn-1,则
   hn+1=h1hn+h2hn-1+…+hnh1  h1=1

所以gn=g0 gn-1 + g1 gn-1 +...+ gn-1 g0

即 gn=Cn

2.二叉树计数:一个有n个结点的二叉树总共有多少种形态

  1. //设当前根节点为k,方案数为h[k],左子树有k-1个节点,右子树有n-k个节点
  2. //则 h[k]=h[k-1]*h[n-k](k=1 to n)
  3. //Ans= h[0]h[n-1] + h[1]h[n-2] +...+ h[n-1][0]
  4. //即卡特兰数
  5. #include<cstdio>
  6. #include<cctype>
  7. using namespace std;
  8. const int N=;
  9.  
  10. int n;
  11. long long H[N];
  12.  
  13. int read()
  14. {
  15. int now=;bool f=;char c=getchar();
  16. for(;!isdigit(c);c=getchar())
  17. if(c=='-') f=;
  18. for(;isdigit(c);c=getchar())
  19. now=(now<<)+(now<<)+c-'';
  20. return f?-now:now;
  21. }
  22.  
  23. int main()
  24. {
  25. n=read();
  26. H[]=;
  27. for(int i=;i<=n;++i)
  28. H[i]=H[i-]*(*i-)/(i+);
  29. printf("%lld",H[n]);
  30. return ;
  31. }

3.出栈次序:一个栈(无穷大)的进栈次序为1、2、3……n。不同的出栈次序有几种。

  我们可以这样想,假设k是最后一个出栈的数。比k早进栈且早出栈的有k-1个数,一共有h(k-1)种方案。比k晚进栈且早出栈的有n-k个数,一共有h(n-k)种方案。所以一共有h(k-1)*h(n-k)种方案。显而易见,k取不同值时,产生的出栈序列是相互独立的,所以结果可以累加。k的取值范围为1至n,所以结果就为h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)。(转自Blog)
  1. //设k为最后一个出栈的数,
  2. //有k-1个比k早进栈且比k早出栈,有C[k-1]种方案
  3. //有n-k个比k晚进栈但比k早出栈,有C[n-k]种方案
  4. //根据乘法原理,C[k]=C[k-1]*C[n-k](k=1 to n)
  5. //Ans = C[0]C[n-1] + C[1][n-2] +...+ C[n-1][0]
  6. #include<cstdio>
  7. using namespace std;
  8. const int N=;
  9.  
  10. int n;
  11. long long Ca[N];
  12.  
  13. int main()
  14. {
  15. scanf("%d",&n);
  16. Ca[]=;
  17. for(int i=;i<=n;++i)
  18. Ca[i]=Ca[i-]*(*i-)/(i+);
  19. printf("%lld",Ca[n]);
  20. return ;
  21. }

注:

  long long最大只能到33

Code:

  1. Ca[]=;
  2. for(int i=;i<=n;++i)
  3. Ca[i]=Ca[i-]*(*i-)/(i+);

Catalan

高精:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. using namespace std;
  5. const int p=,mod=;
  6.  
  7. int C[];
  8.  
  9. inline int read()
  10. {
  11. int now=;bool f=;char c=getchar();
  12. for(;!isdigit(c);c=getchar())
  13. if(c=='-') f=;
  14. for(;isdigit(c);c=getchar())
  15. now=(now<<)+(now<<)+c-'';
  16. return f?-now:now;
  17. }
  18.  
  19. void Print(int n[])
  20. {
  21. printf("%d",n[n[]]);
  22. for(int i=n[]-;i;--i)
  23. printf("%0*d",p,n[i]);
  24. puts("");
  25. }
  26. void Mult(int n[],int t)
  27. {
  28. int x=;
  29. ++n[];
  30. for(int i=;i<=n[];++i)
  31. {
  32. n[i]=n[i]*t+x;
  33. // printf("%d:%d\n",i,n[i]);
  34. x=n[i]/mod;
  35. n[i]%=mod;
  36. }
  37. while(!n[n[]] && n[]>) --n[];
  38. // Print(n);
  39. }
  40. void Div(int n[],int t)
  41. {
  42. int x=;
  43. for(int i=n[];i;--i)
  44. {
  45. n[i]=x*mod+n[i];
  46. x=n[i]%t;
  47. n[i]/=t;
  48. }
  49. while(!n[n[]] && n[]>) --n[];
  50. // Print(n);
  51. }
  52.  
  53. int main()
  54. {
  55. int n=read();
  56. C[]=;
  57. C[]=;
  58. for(int i=;i<=n;++i)
  59. {
  60. // C[now]=C[now-1]*(4*i-2)/(i+1);
  61. // printf("\n%d:\n",i);
  62. Mult(C,*i-);
  63. Div(C,i+);
  64. // Print(C);
  65. }
  66. Print(C);
  67. return ;
  68. }

CODEVS.3113.二叉树计数2

卡特兰数 Catalan 笔记的更多相关文章

  1. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  2. 浅谈卡特兰数(Catalan number)的原理和相关应用

    一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...

  3. 卡特兰数 catalan number

    作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  4. 卡特兰数(Catalan Number) 学习笔记

    一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...

  5. 卡特兰数(Catalan Number) 算法、数论 组合~

    Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...

  6. 卡特兰数(Catalan)及其应用

    卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...

  7. ACM数论-卡特兰数Catalan

    Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...

  8. 【知识总结】卡特兰数 (Catalan Number) 公式的推导

    卡特兰数的英文维基讲得非常全面,强烈建议阅读! Catalan number - Wikipedia (本文中图片也来源于这个页面) 由于本人太菜,这里只选取其中两个公式进行总结. (似乎就是这两个比 ...

  9. 【2020.12.01提高组模拟】卡特兰数(catalan)

    题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...

随机推荐

  1. jmeter中实现java请求实战日志

    view code public class JdbcInsert implements JavaSamplerClient { // 全局变量 PreparedStatement pstmt; Co ...

  2. python模块分析之logging日志(四)

    前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...

  3. startup_MK64F12.s文件解析

    1.前言 本文主要对freescale芯片 MK64F12的启动汇编文件进行注释解析. 2.文件注释 /* ---------------------------------------------- ...

  4. memcmp与strncmp函数【转】

    c中strncmp与memcmp的区别 函数:int memcmp (const void *a1, const void *a2, size_t size)        函数memcmp用于比较字 ...

  5. php 日期格式转换万能公式

    思路用strtotime转换时间的字符串 $t='2017-03-09 02:30'; echo(date('Y-m-d H-i', strtotime($t)));

  6. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  7. oracle ip 改为 机器名

    1 hosts文件 添加                   ip  机器名   这一行 2 修改listner.ora 和tnsora.ora ip改为机器名 3 重启服务

  8. Log4Net 无法写入到SqlServer

    直接进入正题: 今天在测试使用Log4Net写入到数据库的时候,发现一直无法写入到数据库中,而且程式也没有报任何错误. 配置信息如下: <appender name="AdoNetAp ...

  9. idea开发swing(二)

    闲话少说,书接idea开发swing(一). 程序编译完成后,需要打包发布,如果有fat_jar的同学可以通过该插件打包,这里是使用ant来打包,步骤如下: 一.编写build.xml <?xm ...

  10. Oracle11g_OCM 课堂教学目录表

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...