卡特兰数 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\)觉得这样的情况太平凡了.于是,他给出了\( ...
随机推荐
- 【网络编程2】网络编程基础-发送ICMP包(Ping程序)
IP协议 网络地址和主机协议 位于网络层的协议,主要目的是使得网络能够互相通信,该协议使用逻辑地址跨网络通信,目前有两个版本IPV4,IPV6. 在IPV4协议中IP地址是一个32位的数备,采用点分四 ...
- BIM 相关资料
BIM 相关资料:http://pan.baidu.com/share/link?shareid=919219072&uk=966240844
- PhantomJSのメモいろいろ
提供されるモジュール群は5つ phantom: そのもの FileSystem: ファイルに出力したり.依存ファイルの存在確認したり System: コマンドラインから引数取りたいなら WebPage ...
- javascript 添加行,删除行,datepicker获取当前日期和上一个月日期并设置格式,笔记
$(function () { getdatepicker(); today(); getPreMonth(); getdatetimepicker(); }); function today(){ ...
- linux系统下安装redis及配置
下载Redis redis-3.2.11.tar.gz 解压编译 tar xzf redis-3.2.11.tar.gz cd redis-3.2.11 make 编译完成之后,可以看到解压文件red ...
- CentOS7 虚拟机设置文件共享 VMWareTools安装遇到的坑
设置文件共享的前提条件是已经安装好VMware Tools. 现在从安装VMware Tools开始讲起: 第一步:安装VMware Tools (如果安装的centos是最小安装,需要提前安装组件g ...
- Jmeter NonGUI模式
一般情况下我们都是在NonGUI模式下运行jmeter.这样做有两个好处 节省系统资源,能够产生更大的负载 可以通过命令行参数对测试场景进行更精细的配置 示例 创建luzhi.jmx脚本 jmeter ...
- docker安装sonarqube及实际应用
由于平台的多样化,在不同环境的安装方式可能也不一样,为了避免环境不一致带来的差异,特记一笔容器安装: 一.Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题. 1. ...
- java / android int类型如何判空?
/** TextUtils.isEmpty() 方法的实现 * Returns true if the string is null or 0-length. * @param str the str ...
- python第三方包安装方法(两种方法)
具体有以下两种方法: 第一种方法(不使用pip或者easy_install): Step1:在网上找到的需要的包,下载下来.eg. rsa-3.1.4.tar.gz Step2:解压缩该文件. Ste ...