卡特兰数 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>=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)
二.资料
三.某些题
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个结点的二叉树总共有多少种形态
- //设当前根节点为k,方案数为h[k],左子树有k-1个节点,右子树有n-k个节点
- //则 h[k]=h[k-1]*h[n-k](k=1 to n)
- //Ans= h[0]h[n-1] + h[1]h[n-2] +...+ h[n-1][0]
- //即卡特兰数
- #include<cstdio>
- #include<cctype>
- using namespace std;
- const int N=;
- int n;
- long long H[N];
- int read()
- {
- int now=;bool f=;char c=getchar();
- for(;!isdigit(c);c=getchar())
- if(c=='-') f=;
- for(;isdigit(c);c=getchar())
- now=(now<<)+(now<<)+c-'';
- return f?-now:now;
- }
- int main()
- {
- n=read();
- H[]=;
- for(int i=;i<=n;++i)
- H[i]=H[i-]*(*i-)/(i+);
- printf("%lld",H[n]);
- return ;
- }
3.出栈次序:一个栈(无穷大)的进栈次序为1、2、3……n。不同的出栈次序有几种。
- //设k为最后一个出栈的数,
- //有k-1个比k早进栈且比k早出栈,有C[k-1]种方案
- //有n-k个比k晚进栈但比k早出栈,有C[n-k]种方案
- //根据乘法原理,C[k]=C[k-1]*C[n-k](k=1 to n)
- //Ans = C[0]C[n-1] + C[1][n-2] +...+ C[n-1][0]
- #include<cstdio>
- using namespace std;
- const int N=;
- int n;
- long long Ca[N];
- int main()
- {
- scanf("%d",&n);
- Ca[]=;
- for(int i=;i<=n;++i)
- Ca[i]=Ca[i-]*(*i-)/(i+);
- printf("%lld",Ca[n]);
- return ;
- }
注:
long long最大只能到33
Code:
- Ca[]=;
- for(int i=;i<=n;++i)
- Ca[i]=Ca[i-]*(*i-)/(i+);
Catalan
高精:
- #include<cstdio>
- #include<cctype>
- #include<cstring>
- using namespace std;
- const int p=,mod=;
- int C[];
- inline int read()
- {
- int now=;bool f=;char c=getchar();
- for(;!isdigit(c);c=getchar())
- if(c=='-') f=;
- for(;isdigit(c);c=getchar())
- now=(now<<)+(now<<)+c-'';
- return f?-now:now;
- }
- void Print(int n[])
- {
- printf("%d",n[n[]]);
- for(int i=n[]-;i;--i)
- printf("%0*d",p,n[i]);
- puts("");
- }
- void Mult(int n[],int t)
- {
- int x=;
- ++n[];
- for(int i=;i<=n[];++i)
- {
- n[i]=n[i]*t+x;
- // printf("%d:%d\n",i,n[i]);
- x=n[i]/mod;
- n[i]%=mod;
- }
- while(!n[n[]] && n[]>) --n[];
- // Print(n);
- }
- void Div(int n[],int t)
- {
- int x=;
- for(int i=n[];i;--i)
- {
- n[i]=x*mod+n[i];
- x=n[i]%t;
- n[i]/=t;
- }
- while(!n[n[]] && n[]>) --n[];
- // Print(n);
- }
- int main()
- {
- int n=read();
- C[]=;
- C[]=;
- for(int i=;i<=n;++i)
- {
- // C[now]=C[now-1]*(4*i-2)/(i+1);
- // printf("\n%d:\n",i);
- Mult(C,*i-);
- Div(C,i+);
- // Print(C);
- }
- Print(C);
- return ;
- }
CODEVS.3113.二叉树计数2
卡特兰数 Catalan 笔记的更多相关文章
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 浅谈卡特兰数(Catalan number)的原理和相关应用
一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...
- 卡特兰数 catalan number
作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- 卡特兰数(Catalan Number) 学习笔记
一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...
- 卡特兰数(Catalan Number) 算法、数论 组合~
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...
- 卡特兰数(Catalan)及其应用
卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...
- ACM数论-卡特兰数Catalan
Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...
- 【知识总结】卡特兰数 (Catalan Number) 公式的推导
卡特兰数的英文维基讲得非常全面,强烈建议阅读! Catalan number - Wikipedia (本文中图片也来源于这个页面) 由于本人太菜,这里只选取其中两个公式进行总结. (似乎就是这两个比 ...
- 【2020.12.01提高组模拟】卡特兰数(catalan)
题目 题目描述 今天,接触信息学不久的小\(A\)刚刚学习了卡特兰数. 卡特兰数的一个经典定义是,将\(n\)个数依次入栈,合法的出栈序列个数. 小\(A\)觉得这样的情况太平凡了.于是,他给出了\( ...
随机推荐
- jmeter中实现java请求实战日志
view code public class JdbcInsert implements JavaSamplerClient { // 全局变量 PreparedStatement pstmt; Co ...
- python模块分析之logging日志(四)
前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...
- startup_MK64F12.s文件解析
1.前言 本文主要对freescale芯片 MK64F12的启动汇编文件进行注释解析. 2.文件注释 /* ---------------------------------------------- ...
- memcmp与strncmp函数【转】
c中strncmp与memcmp的区别 函数:int memcmp (const void *a1, const void *a2, size_t size) 函数memcmp用于比较字 ...
- php 日期格式转换万能公式
思路用strtotime转换时间的字符串 $t='2017-03-09 02:30'; echo(date('Y-m-d H-i', strtotime($t)));
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- oracle ip 改为 机器名
1 hosts文件 添加 ip 机器名 这一行 2 修改listner.ora 和tnsora.ora ip改为机器名 3 重启服务
- Log4Net 无法写入到SqlServer
直接进入正题: 今天在测试使用Log4Net写入到数据库的时候,发现一直无法写入到数据库中,而且程式也没有报任何错误. 配置信息如下: <appender name="AdoNetAp ...
- idea开发swing(二)
闲话少说,书接idea开发swing(一). 程序编译完成后,需要打包发布,如果有fat_jar的同学可以通过该插件打包,这里是使用ant来打包,步骤如下: 一.编写build.xml <?xm ...
- Oracle11g_OCM 课堂教学目录表
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...