卡特兰数 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\)觉得这样的情况太平凡了.于是,他给出了\( ...
随机推荐
- Elastic-Job-Lite分析——作业调度器 JobScheduler 的创建过程
-----------------------------------1. 创建注册中心的对象----------------------------------------------------- ...
- 移动端中遇到的坑(bug)!!!
1.模拟单选点击的时候,在ios手机下,点击下面的内容选择,会出现页面闪一闪!! 解决方案:样式重置html的时候加上这句 -webkit-tap-highlight-color: rgba(0, ...
- springboot系列四、配置模板引擎、配置热部署
一.配置模板引擎 在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html ...
- mysql系列十一、mysql优化笔记:表设计、sql优化、配置优化
可以从这些方面进行优化: 数据库(表)设计合理 SQL语句优化 数据库配置优化 系统层.硬件层优化 数据库设计 关系数据库三范式 1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非 ...
- memory_target
ALTER SYSTEM SET MEMORY_TARGET = 33024M; ALTER SYSTEM SET MEMROY_MAX_TARGET= 33024M SCOPE=SPFILE; sh ...
- 整理一下odoo10在windows系统下部署的流程
odoo10环境搭建 所需依赖: Python3.5 odoo10.0 Node.js PostgreSQL 9.5 PyCharm 专业版 1.首先先安装好Python3.5,并设置好环境变量 2. ...
- nodejs后台向后台get请求
1 前言 有时在nodejs写的服务端某方法需要向服务端另一个接口发送get请求,可以使用第三方库,然后直接使用即可,此文章只是用来记录使用 2 方法 2.1 get 请求 //1. Install ...
- mysql5.7安装教程图解
启动安装包: 左边是你电脑上可以连接到mysql的软件,比如Visual Studio,Eclipse,PyCharm等,中间是需求的版本或者额外组件,右边是状态. 选择一个选项,然后点击下面的che ...
- PHP接口继承及接口多继承原理与实现方法详解
在PHP的接口中,接口可以继承接口.虽然PHP类只能继承一个父类(单继承),但是接口和类不同,接口可以实现多继承,可以继承一个或者多个接口.当然接口的继承也是使用extends关键字,要多个继承的话只 ...
- Luogu P4945 【最后的战役】
本来以为做法一样,就是少带个$log$,结果发现看不懂出题人的题解(我好菜啊) 那就自己写一篇吧 比较简单的$DP$思路 状态定义: 前两个转移很好处理,第三个好像就不好办了 不妨暴力定义进状态里 设 ...