一.公式

卡特兰数一般公式

  令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个结点的二叉树总共有多少种形态

 //设当前根节点为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早进栈且早出栈的有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)
 //设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 笔记的更多相关文章

  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. 【网络编程2】网络编程基础-发送ICMP包(Ping程序)

    IP协议 网络地址和主机协议 位于网络层的协议,主要目的是使得网络能够互相通信,该协议使用逻辑地址跨网络通信,目前有两个版本IPV4,IPV6. 在IPV4协议中IP地址是一个32位的数备,采用点分四 ...

  2. BIM 相关资料

    BIM 相关资料:http://pan.baidu.com/share/link?shareid=919219072&uk=966240844

  3. PhantomJSのメモいろいろ

    提供されるモジュール群は5つ phantom: そのもの FileSystem: ファイルに出力したり.依存ファイルの存在確認したり System: コマンドラインから引数取りたいなら WebPage ...

  4. javascript 添加行,删除行,datepicker获取当前日期和上一个月日期并设置格式,笔记

    $(function () { getdatepicker(); today(); getPreMonth(); getdatetimepicker(); }); function today(){ ...

  5. linux系统下安装redis及配置

    下载Redis redis-3.2.11.tar.gz 解压编译 tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make 编译完成之后,可以看到解压文件red ...

  6. CentOS7 虚拟机设置文件共享 VMWareTools安装遇到的坑

    设置文件共享的前提条件是已经安装好VMware Tools. 现在从安装VMware Tools开始讲起: 第一步:安装VMware Tools (如果安装的centos是最小安装,需要提前安装组件g ...

  7. Jmeter NonGUI模式

    一般情况下我们都是在NonGUI模式下运行jmeter.这样做有两个好处 节省系统资源,能够产生更大的负载 可以通过命令行参数对测试场景进行更精细的配置 示例 创建luzhi.jmx脚本 jmeter ...

  8. docker安装sonarqube及实际应用

    由于平台的多样化,在不同环境的安装方式可能也不一样,为了避免环境不一致带来的差异,特记一笔容器安装: 一.Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题. 1. ...

  9. java / android int类型如何判空?

    /** TextUtils.isEmpty() 方法的实现 * Returns true if the string is null or 0-length. * @param str the str ...

  10. python第三方包安装方法(两种方法)

    具体有以下两种方法: 第一种方法(不使用pip或者easy_install): Step1:在网上找到的需要的包,下载下来.eg. rsa-3.1.4.tar.gz Step2:解压缩该文件. Ste ...