一.公式

卡特兰数一般公式

  令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. SpringBoot修改Servlet相关配置

    第一种方式在配置文件中进行修改 server.port=8081 server.servlet.context-path=/springboot server.tomcat.uri-encoding= ...

  2. SpringBoot PUT请求

    (1)配置HiddenHttpMethodFilter(SpringMVC需要配置,SpringBoot已经为我们自动配置了) (2)在视图页面创建一个Post Form表单,在表单中创建一个inpu ...

  3. Python|绝不乱入的靠谱书单

  4. caffe-win10-cifar10

    因为是在win10下安装的GPU版caffe,所以不能直接运行linux里的shell脚本.但是win10自带bash,可以运行.sh文件,网上也有直接下Cygwin和git的.我是下载好git后才知 ...

  5. ES系列十六、集群配置和维护管理

    一.修改配置文件 1.节点配置 1.vim elasticsearch.yml # ======================== Elasticsearch Configuration ===== ...

  6. oracle数据库自增主键重复

    select max(t.id) from T_PLAT_ENUM_VALUE tdrop sequence T_PLAT_ENUM_VALUE;create sequence T_PLAT_ENUM ...

  7. linux windows 共享文件夹

    1.首先在windows上共享一个目录,如:共享了目录share,用户和密码都是:massky 2.在linux机器上,在/mnt目录下建立一个ml45目录,使用root用户,执行下面命令: moun ...

  8. zabbix系列(三)zabbix3.0.4微信告警配置详解

    一.准备工作 申请微信公众号,并且是可以有发送消息的接口.添加有个脚本去调用微信的api. 之后可以参考下zabbix 的搭建,然后了解下脚本报警,之后再考虑报警方式的多样化. 个人微信一个 个人邮箱 ...

  9. rt3070无线网卡移植到开发板

    Rt3070无线网卡AP功能移植到GEC210一.平台开发板:GEC210 无线网卡:RT3070主机:VMWare--Ubuntu 10.04 LTS内核版本:linux-2.6.35.7编译器:a ...

  10. 09-伪数组 arguments

    arguments代表的是实参.有个讲究的地方是:arguments只在函数中使用. (1)返回函数实参的个数:arguments.length 例子: fn(2,4); fn(2,4,6); fn( ...