一.公式

卡特兰数一般公式

  令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. Check Box、Radio Button、Combo Box控件使用

    Check Box.Radio Button.Combo Box控件使用 使用控件的方法 1.拖动控件到对话框 2. 定义控件对应的变量(值变量或者控件变量) 3.响应控件各种消息 Check Box ...

  2. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  3. linux服务器last查看关机记录

    1.查看重启记录 last reboot命令 [root@test ~]# last reboot reboot system boot -.el6.x Mon May : - : (+:) rebo ...

  4. js使用中的小问题----textarea是否有value属性

    使用jquery的选择器时想给textarea设置一个默认值时,采取了下面的方法: 不过失败了,但是看教程上确实成功的,那么肯定是有问题的. 经过上网查找以及自己验证发现: 1.textarea标签确 ...

  5. centos6下通用二进制安装mysql5.5.33

    mysql5.5通用二进制格式安装方法 1.解压到 /usr/local 目录 # tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local 2 ...

  6. Linux多台机器配置ssh免登录

    .安装ssh. sudo apt-get install ssh. 安装完成后会在~目录(当前用户主目录,即这里的/home/xuhui)下产生一个隐藏文件夹.ssh(ls -a 可以查看隐藏文件). ...

  7. Java用四种方法实现阶乘n! (factorial)

    1. 引言 实现阶乘的方法很多,这边介绍四种方法,分别是递归,尾递归,循环和BigDecimal. 2. 代码 public class Test { public static void main( ...

  8. selenium和pyquery抓取异步加载数据

    安装selenium和pyquery 打开命令行输入: pip install selenium pip install pyquery chromedriver的下载地址如下: http://chr ...

  9. Office系列版本安装包下载

    链接:http://pan.baidu.com/s/1i4UFZOp  密码:f9y8 链接:http://pan.baidu.com/s/1i4YJN4D 密码:743q 链接:http://pan ...

  10. python 全栈开发,Day140(RabbitMQ,基于scrapy-redis实现分布式爬虫)

    一.RabbitMQ 队列 在生产者消费模型中,比如去餐馆吃饭的例子.生产者相当于厨师,队列相当于服务员,消费者就是你. 我们必须通过服务员,才能吃饭! 如果队列满了,队列会一直hold住.必须让消费 ...