卡特兰数的公式

递推公式1:$f(n)=\sum \limits_{i=0}^{n-1}f(i)*f(n-i-1)$

递推公式2:$f(n)=\frac{f(n-1)*(4*n-2)}{n+1}$

组合公式1:$f(n)=\frac{C_{2n}^{n}}{n+1}$

组合公式2:$f(n)=C_{2n}^{n}-C_{2n}^{n-1}$

关于卡特兰数的题目

1. 有限制的网格方案数   eg网格

利用组合数的思想:

对于长N宽M的网格(下图2),方案数为 $C_{n+m}^{m}-C_{n+m}^{m-1}$

理解:走到(n,m)这个点总共要走n+m步,其中有m步一定是向上的,所以$C_{n+m}^{m}$这是所有情况

   但有不合法的情况,且不合法的一定经过绿线,将原图形沿其翻折,相当于走到c点,此时总n+m步不变,但只有m-1步是向右的

   所以$C_{n+m}^{m-1}$是不合法的

                                                              (借用kaola学长的图)

对于N×N的网格就是卡特兰数了,如图一

本题先将式子化简,然后将其分解质因数,消去除法,最后乘上每个质数的个数次方就好

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. int n,m,num,p[],v[];
  7. int sum[];
  8. void prime(int x)
  9. {
  10. for(int i=;i<=x;i++)
  11. {
  12. if(!v[i]) {v[i]=i;p[++num]=i;}
  13. for(int j=;j<=num;j++){
  14. if(p[j]>v[i]||i*p[j]>x) continue;
  15. v[i*p[j]]=p[j];
  16. }
  17. }
  18. }
  19. int len=,ans[];
  20. void mul(int x)
  21. {
  22. int k=;
  23. for(int i=;i<=len;i++)
  24. {
  25. ans[i]=ans[i]*x+k;
  26. k=ans[i]/;
  27. ans[i]%=;
  28. if(k>&&i==len) len++;
  29. }
  30. }
  31. int main()
  32. {
  33. ans[]=;
  34. scanf("%d%d",&n,&m);
  35. prime(n+m+);
  36. int t=n+-m;
  37. while(t>)
  38. {
  39. sum[v[t]]++;
  40. t/=v[t];
  41. }
  42. for(int i=n+m;i>=n+;i--)
  43. {
  44. t=i;
  45. while(t>)
  46. {
  47. sum[v[t]]++;
  48. t/=v[t];
  49. }
  50. }
  51. for(int i=;i<=m;i++)
  52. {
  53. t=i;
  54. while(t>)
  55. {
  56. sum[v[t]]--;
  57. t/=v[t];
  58. }
  59. }
  60. for(int i=;i<=num;i++)
  61. for(int j=;j<=sum[p[i]];j++)
  62. mul(p[i]);
  63. for(int i=len;i>=;i--)
  64. printf("%d",ans[i]);
  65. puts("");
  66. }

2.有趣的数列

其实这个也可以理解为上一个网格,将偶数位记为向右走一步,奇数位记为向上走一步,,偶数位之和大于奇数位之和,就是不能越过绿线

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #define ll long long
  6. using namespace std;
  7. const int maxn=;
  8. int n,mod,num;
  9. ll p[maxn];int v[maxn];
  10. ll sum[maxn];
  11. void prime(int x)
  12. {
  13. for(int i=;i<=x;i++)
  14. {
  15. if(!v[i]) {v[i]=i;p[++num]=i;}
  16. for(int j=;j<=num;j++){
  17. if(p[j]>v[i]||i*p[j]>x) break;
  18. v[i*p[j]]=p[j];
  19. }
  20. }
  21. }
  22. ll qpow(int a,int b)
  23. {
  24. ll ans=;
  25. while(b)
  26. {
  27. if(b&) ans=ans*a%mod;
  28. a=a*a%mod;
  29. b>>=;
  30. }
  31. return ans%mod;
  32. }
  33. int main()
  34. {
  35. scanf("%d%d",&n,&mod);
  36. prime(*n+);
  37. for(int i=*n;i>=n+;i--)
  38. {
  39. int t=i;
  40. while(t>)
  41. {
  42. sum[v[t]]++;
  43. t/=v[t];
  44. }
  45. }
  46. for(int i=;i<=n;i++)
  47. {
  48. int t=i;
  49. while(t>)
  50. {
  51. sum[v[t]]--;
  52. t/=v[t];
  53. }
  54. }
  55. ll ans=;
  56. for(int i=;i<=num;i++)
  57. if(sum[p[i]])
  58. ans=ans*qpow(p[i],sum[p[i]])%mod;
  59. printf("%lld\n",ans);
  60. }

3.树屋阶梯

我们不妨手模样例,若扣去左下角直角所在矩形,

图一和图四的方案数为右面的2块的方案数×上面的0块的方案数,即为$f(3)+=f(2)*f(0)$

同理图二和图五为$f(3)+=f(0)*f(2)$   图三为$f(3)+=f(1)*f(1)$

由此可得  $f(n)=\sum \limits_{i=0}^{n-1}f(i)*f(n-i-1)$  卡特兰数公式1

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. int n,num,p[],v[];
  7. int sum[];
  8. void prime(int x)
  9. {
  10. for(int i=;i<=x;i++)
  11. {
  12. if(!v[i]) {v[i]=i;p[++num]=i;}
  13. for(int j=;j<=num;j++){
  14. if(p[j]>v[i]||i*p[j]>x) break;
  15. v[i*p[j]]=p[j];
  16. }
  17. }
  18. }
  19. int len=,ans[];
  20. void mul(int x)
  21. {
  22. int k=;
  23. for(int i=;i<=len;i++)
  24. {
  25. ans[i]=ans[i]*x+k;
  26. k=ans[i]/;
  27. ans[i]%=;
  28. if(k>&&i==len) len++;
  29. }
  30. }
  31. int main()
  32. {
  33. ans[]=;
  34. scanf("%d",&n);
  35. prime(*n+);
  36. for(int i=*n;i>=n+;i--)
  37. {
  38. int t=i;
  39. while(t>)
  40. {
  41. sum[v[t]]++;
  42. t/=v[t];
  43. }
  44. }
  45. for(int i=;i<=n;i++)
  46. {
  47. int t=i;
  48. while(t>)
  49. {
  50. sum[v[t]]--;
  51. t/=v[t];
  52. }
  53. }
  54. for(int i=;i<=num;i++)
  55. for(int j=;j<=sum[p[i]];j++)
  56. mul(p[i]);
  57. for(int i=len;i>=;i--)
  58. printf("%d",ans[i]);
  59. puts("");
  60. }

关于卡特兰数的其他应用

1.出栈入栈问题:1,2,~n个数经过一个栈,合法的出栈序列$Cat(n)$

  (引用学长的课件)出栈次序是卡特兰数的一个应用。 我们将入栈视为+1,出栈视为-1,则限制条件为在任意位置前缀和不小于0 。 我们讨论这个问题与卡特兰数有什么关系。 为了方便,我们按入栈的先后顺序将各个元素由1到n编号。 假设最后一个出栈的数为k。 则在k入栈之前,比k小的数一定全部出栈,所以这部分方案数为h(k-1)。 在k入栈之后,比k大的数在k入栈之后入栈,在k出栈之前出栈,所以这部分的方案数为h(n-k)。 这两部分互不干扰,则方案数为h(k-1)*h(n-k) 枚举k,得到的公式就是卡特兰数的递推公式。

2.左括号与右括号的匹配问题:n个左括号和n个右括号组成的合法括号序列$Cat(n)$

  跟入栈出栈的理解是一样的

3.n个节点构成的二叉树的方案数为$Cat(n)$

  假设左子树有$i$个节点,右子树有$n-i-1$个节点,i从0到n-1,根据乘法原理

可得公式1$f(n)=\sum \limits_{i=0}^{n-1}f(i)*f(n-i-1)$

卡特兰数(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) 算法、数论 组合~

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

  5. 卡特兰数 Catalan 笔记

    一.公式 卡特兰数一般公式 令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>= ...

  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) 学习笔记

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

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

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

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

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

随机推荐

  1. diskpart

    比如格式化成fat32 format fs=fat32 quick 比鼠标方便 如何使用: 打开cmd输入diskpart进入命令 首先 list disk 然后 然后 clean 然后 create ...

  2. Jmeter接口测试(第二篇)

    一.新建项目 1.运行Jmeter.bat打开Jmeter 2.添加线程组(测试计划->添加->Thread(users)->线程组) 3.添加HTTP请求(线程组->添加-& ...

  3. js 属性的遍历

    引自:http://es6.ruanyifeng.com/#docs/object 属性的遍历 ES6 一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和 ...

  4. vue:解决使用param传参后,再次刷新页面会新增一个原有的tab

    问题:在最近的项目中,我通过传递不同的参数,复用同一组件进行渲染,然而意外出现一个bug,就是当我重新刷新该页面时,会新增一个tab 原来的: 刷新页面后: 查阅资料后,发现该现象是由于通过param ...

  5. Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)

    P2845 [USACO15DEC]Switching on the Lights 开关灯 题意 题目背景 来源:usaco-2015-dec \(Farm\ John\)最近新建了一批巨大的牛棚.这 ...

  6. 全面解析Spring中@ModelAttribute注解的用法

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...

  7. BZOJ3907 网格 卡特兰数

    题目描述 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m. 现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左 ...

  8. ROS urdf和xacro文件详解

    视觉标签:visual <visual> <origin xyz="0.0 0.0 0.0" /> <geometry> <box siz ...

  9. Inoic 滚动条问题

    1.看图说话 2.没有超过一个页,怎样去掉图中的滚动条? 3修改后预览效果

  10. 微信小程序——页面跳转传值

    比如从index.wxml跳转到aaa.wxml index.wml <navigator url="../aaa/aaa?id=1" > </navigator ...