catalan---卡特兰数(小结)
(关于卡特兰数的详细介绍)http://baike.baidu.com/view/2499752.htm
下面有练习的题目:
经过测试,_int64/long long 最大只能表示到33位,超过这个范围就要用大数来表示。。。
有几个重要的公式是要记得的
F(n)=f(n-1)*(4*n-2)/(n+1);
还有 f(n)=C(2n,n)/(n+1);
或者 f(n)=c(2n,n)-c(2n,n+1);
http://acm.hdu.edu.cn/showproblem.php?pid=1023
代码:
- #include<stdio.h>
- #define maxn 100
- int arr[][maxn+]={{},{},{}};
- //利用f(n)=f(n-1)*(4n-2)/(n+1);
- int main()
- {
- int s, c=,i,j,k;
- for(i=;i<=;i++)
- {
- for(j=;j<=maxn;j++) //先计算乘法部分
- {
- arr[i][j]=arr[i-][j]*(*i-)+c;
- c=arr[i][j]/;
- arr[i][j]%=;
- }
- s=c=;
- for(k=maxn;arr[i][k]==;k--); //计算除法部分
- for(j=k;j>=;j--)
- {
- s=arr[i][j]+*c;
- c=s%(i+);
- arr[i][j]=(s-c)/(i+);
- }
- }
- int n;
- while(scanf("%d",&n)!=EOF)
- {
- for(i=maxn;arr[n][i]==;i--);
- for(j=i;j>=;j--)
- printf("%d",arr[n][j]);
- puts("");
- }
- return ;
- }
- //后记,由于测试的时候,发现_int64/long long,都wa了,所以果断的用大数来
- //做了...
- //f(n)=f(n-1)*(4*n-2)/(n+1)......f(n)=c(2n,n)-c(2n,n+1)...
- //f(n)=c(2n,n)/(n+1)...卡特兰数..很重要的...再次说明..希望不要嫌啰嗦、
http://acm.hdu.edu.cn/showproblem.php?pid=4165
代码
- #include<iostream>
- using namespace std;
- int main()
- {
- long long arr[]={,,,};
- for(int i=;i<=;i++)
- arr[i]=arr[i-]*(*i-)/(i+);
- int n;
- while(cin>>n,n)
- cout<<arr[n]<<endl;
- return ;
- }
http://acm.hdu.edu.cn/showproblem.php?pid=1130
代码
- #include<iostream>
- #define maxn 100
- using namespace std;
- int arr[maxn+][maxn+]={{},{},{}};
- int main()
- {
- int i,j,k,s,c,n;
- s=c=;
- for(i=;i<=maxn;i++)
- {
- for(j=;j<=maxn;j++)
- {
- s=arr[i-][j]*(*i-)+c;
- c=s/;
- arr[i][j]=s%;
- }
- s=c=;
- for(k=maxn;arr[i][k]==;k--);
- for(j=k;j>=;j--)
- {
- s=arr[i][j]+*c;
- c=s%(i+);
- arr[i][j]=s/(i+);
- }
- }
- while(cin>>n)
- {
- for(i=maxn;arr[n][i]==;i--);
- for(j=i;j>=;j--)
- cout<<arr[n][j];
- cout<<endl;
- }
- return ;
- }
http://poj.org/problem?id=2084
代码:
- #include<iostream>
- #define maxn 80
- using namespace std;
- int arr[][maxn+]={{},{},{}};
- int main()
- {
- int i,j,k,s,c,n;
- for(i=;i<=;i++)
- {
- for(j=,s=c=;j<=maxn;j++)
- {
- s=(arr[i-][j]*(*i-)+c);
- arr[i][j]=s%;
- c=(s-arr[i][j])/;
- }
- for(k=maxn;arr[i][k]==;k--);
- for(j=k,s=c=;j>=;j--)
- {
- s=(arr[i][j]+*c);
- c=s%(i+);
- arr[i][j]=(s-c)/(i+);
- }
- }
- while(cin>>n,n>=)
- {
- for(i=maxn;arr[n][i]==;i--);
- for(j=i;j>=;j--)
- cout<<arr[n][j];
- cout<<endl;
- }
- return ;
- }
关于卡特兰公式的扩展问题....
关于扩展的卡特兰数:
1.(n-m+1)/(n+1)*c(n+m,n)
2.c[n+m][n]-c[n+m][m-1]
Catalan,Eugene,Charles,卡特兰(1814~1894)比利时数学家,生于布鲁日(Brugge),早年在巴黎综合工科学校就读。1856年任列日(Liege)大学数学教授,并被选为比利时布鲁塞尔科学院院士。
卡特兰一生共发表200多种数学各领域的论著。在微分几何中,他证明了下述所谓的卡特兰定理:当一个直纹曲线是平面和一般的螺旋面时,他只能是实的极小曲面。他还和雅可比(Jacobi,C·G·J)同时解决了多重积分的变量替换问题,建立了有关的公式。
1842年,他提出了一种猜想:方程xz-yt=1没有大于1的正整数解,除非平凡情形32-23=1。这一问题至今尚未解决。
(mathoe注:即除了8、9这两个连续正整数都是正整数的方幂外,没有其他。1962年我国数学家柯召以极其精湛的方法证明了不存在三个连续正整数,它们都是正整数的方幂,以及方程x2-yn=1,n>1,xy≠0无正整数解。并且还证明了如果卡特兰猜想不成立,其最小的反例也得大于1016。)
此外,卡特兰还在函数论、伯努利数和其他领域也做出了一定的贡献。
卡特兰通过解决凸n边形的剖分得到了数列Cn。
凸n+2边形用其n-1条对角线把此凸n+2边形分割为互不重叠的三角形,这种分法的总数为Cn。
为纪念卡特兰,人们使用“卡特兰数”来命名这一数列。
据说有几十种看上去毫不相干的组合计数问题的最终表达式都是卡特兰数的形式。
卡特兰数在数学竞赛、信息学竞赛、组合数学、计算机编程等都会有其不同侧面的介绍。
前几个卡特兰数:规定C0=1,而
C1=1,C2=2,C3=5,C4=14,C5=42,
C6=132,C7=429,C8=1430,C9=4862,C10=16796,
C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845。
递推公式
圆周上有标号为1,2,3,4,……,2n的共计2n个点,这2n个点配对可连成n条弦,且这些弦两两不相交的方式数为卡特兰数Cn。
2003年浙江省小学数学夏令营竞赛考了这个题:圆周上10个点可以连成既不相交,也没有公共端点的5条线段,不同的连法共有_____种。
答:方法的种数是卡特兰数C5=42,此题被收录进单墫主编的知识出版社出版的《华数奥赛强化训练》小学六年级册的“计数问题”专题。
共六种类型,第1类有5种连法,第2类有2种连法,第3类有10种连法,第4类有10种连法,第5类有10种连法,第6类有5种连法。共有42种连法。
1994年《小学数学》有奖征答竞赛:游乐园门票1元一张,每人限购一张。现在有10个小朋友排队购票,其中5个小朋友每人只有1元的钞票一张,另5个小朋友每人只有2元的钞票一张,售票员没有准备零钱。问:有多少种排队方法,使售票员总能找的开零钱?
(此题也被许多奥数资料收录为例题或习题,《华罗庚学校数学课本》小学六年级册的思维训练也收有此题)
答:现把拿1元的5个小朋友看成是相同的,把拿2元的5个小朋友也看成是相同的,使用我们常用的“逐点累加法”:
图中每条小横段表示拿1元的小朋友,每条小竖段表示拿2元的小朋友,要求从A走到B的过程中网格中任何点均有横段数不小于竖段数:拿1元的要先,且人数不能少于拿2元的,即不能越过对角线AB:每个点所标的数即为从A走到此点的方法数。求从A到B的走法的方法数。逐点累加可求出为42,即卡特兰数C5=42。
又由于每个小朋友是不相同的,所以共有42×5!×5!=42×120×120=604800种情况。
若把此题的10个人,拿1元的有5人,拿2元的有5人改为共有2n个人,拿1元的n人,拿2元的n人,则符合要求的排队方法数为:
再一个卡特兰数的例子:
甲乙两人比赛乒乓球,最后结果为20∶20,问比赛过程中甲始终领先乙的计分情形的种数。
即甲在得到1分到19分的过程中始终领先乙,其种数是卡特兰数
再一个卡特兰数的例子
饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个放进碗橱摞成一摞。一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式?
答:得数是第n个卡特兰数Cn。
再一个卡特兰数的例子
一个汽车队在狭窄的路面上行驶,不得超车,但可以进入一个死胡同去加油,然后再插队行驶,共有n辆汽车,问共有多少种不同的方式使得车队开出城去?
答:得数是第n个卡特兰数Cn。
卡特兰数
求证:卡特兰数Cn是整数。
证明:
①取整函数不等式:对任意实数x,y有[x+y]≥[x]+[y]。这里[x]表示不大于实数x的最大整数。
解:由定义x≥[x]……(1)
y≥[y]……(2)以上两式相加,得:x+y≥[x]+[y],
把上式再取整,得:[x+y]≥[[x]+[y]]=[x]+[y],即[x+y]≥[x]+[y]。
②1000!的末尾0的个数249个。(现在有的小学奥数书上出现了100!末尾有几个零的题目:24个)
解:1000÷5=200,
200÷5=40,
40÷5=8,
8÷5=1……3
以上各商相加,即得1000!末尾0的个数=200+40+8+1=249个。
③n!的质因数分解式中质因子p的幂次数:
…………(1)
k!的质因数分解式中质因子p的幂次数
…………(2)
(n-k)!的质因数分解式中质因子p的幂次数
…………(3)
这里写成西格马求和式时使用了无穷的形式,但是从某一确定项之后的每项都是0,为了统一,都写成了“∞”形式。
④组合数是整数
解:
⑤卡特兰数是整数
⑥卡特兰数是整数的另外一个证明
④组合数是整数
⑤卡特兰数是整数
⑥卡特兰数是整数的另一个证明
凸六边形剖分成三角形的14种方法,是卡特兰数C4
从左下角(0,0)走到右上角(4,4),只允许向上、向右走,但不允许穿过对角线的方法数是14种,是卡特兰数C4
1936第40届匈牙利奥林匹克数学竞赛 第1题考了Catalan恒等式的证明。
1979第21届国际数学奥林匹克 第1题考了一个卡特兰恒等式的应用的题目
此题由1989年第1届匈牙利-以色列数学竞赛题改编。
有下面的练习题:
http://acm.hdu.edu.cn/showproblem.php?pid=2067
代码:
- #include<iostream>
- #define maxn 40
- using namespace std;
- int arr[][maxn+]={{},{}};
- int main()
- {
- int i,j,k,c,s;
- for(i=;i<=;i++)
- {
- for(j=,c=,s=;j<=maxn;j++)
- {
- s=(arr[i-][j]*(*i-)+c);
- arr[i][j]=s%;
- c=(s-arr[i][j])/;
- }
- for(j=maxn;arr[i][j]==;j--);
- for(k=j,s=c=;k>=;k--)
- {
- s=(arr[i][k]+c*);
- c=s%(i+);
- arr[i][k]=(s-c)/(i+);
- }
- }
- int n,count=;
- while(cin>>n,n>)
- {
- cout<<count++<<" "<<n<<" ";
- for(i=maxn;arr[n][i]==;i--);
- for(j=i;j>=;j--)
- cout<<arr[n][j];
- cout<<endl;
- }
- return ;
- }
暂时,就归纳这么多吧!!。。。。
catalan---卡特兰数(小结)的更多相关文章
- Catalan卡特兰数入门
简介 卡特兰数是组合数学中的一种常见数列 它的前几项为: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, ...
- catalan卡特兰数
卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜密率捷法>最 ...
- 卡特兰数 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>= ...
- 卡特兰数(Catalan)
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, ...
- 卡特兰数(Catalan Number) 算法、数论 组合~
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 卡特兰数(Catalan)简介
Catalan序列是一个整数序列,其通项公式是 h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, ...
- catalan 数——卡特兰数(转)
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- Catalan Number 卡特兰数
内容部分来自以下博客: Cyberspace_TechNode 邀月独斟 一个大叔 表示感谢! Catalan数的引入: 一个长度为2N的序列,里面有N个+1,N个-1 它的任意前缀和均非负,给定N, ...
- Catalan数——卡特兰数
一.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& ...
随机推荐
- Metasploit连接postgres数据库
操作环境为Kali虚拟机 root@kali:~# apt-get install postgresql 启动服务 root@kali:~# service postgresql start [ ok ...
- Spring源码学习之:spring注解@Transactional
在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. 事务的基本概念 先来回顾一下事务的基本概念和特性.数据库事务(Database Transaction) ,是 ...
- ps图层混合模式
溶解: ------------- 变暗:当使用该模式时,图像中的颜色或物体,总是其中颜色比较深的覆盖比较浅的,而数值相同或更深的像素不受影响.但记住,是上层针对下层,也就是说要有两个图层才有用 正片 ...
- DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf
DYNAMIC_DOWNCAST.STATIC_DOWNCAST.CRuntimeClass和IsKindOf DYNAMIC_DOWNCAST(class, pointer ):如果pointe ...
- gcviewer待整理
官网:https://github.com/chewiebug/GCViewer G1 Gabage Collector -XX:+UnlockExperimentalVMOptions -XX:+U ...
- struts2标签整理
在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题, 一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件: Java代码 ...
- Linux中的15个‘echo’ 命令实例
echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串. echo命令的语法是: echo [选 ...
- 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】
来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...
- 一、PHP MongoDB Windows7_64位安装与配置
NoSQL现在非常的流行了,由于我所在的公司环境问题,目前还用不到这种数据库,出于好奇,翻了翻资料,也算自学了一下.在此做下记录. 我的本机环境:APMServ5.2.6,PHP肯定就是5.2了. 1 ...
- xshell 5连接linux服务器的技巧
1.用sttp 方式连接服务器,命令识别不了,用ssh方式才能有效