组合数学

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

组合数学中的基本原理及其应用

卡特兰数

Catalan,Eugene,Charles,卡特兰(1814~1894)比利时数学家,生于布鲁日(Brugge),早年在巴黎综合工科学校就读。1856年任列日(Liege)大学数学教授,并被选为比利时布鲁塞尔科学院院士。

卡特兰一生共发表200多种数学各领域的论著。在微分几何中,他证明了下述所谓的卡特兰定理:当一个直纹曲线是平面和一般的螺旋面时,他只能是实的极小曲面。他还和雅可比(Jacobi,C·G·J)同时解决了多重积分的变量替换问题,建立了有关的公式。

1842年,他提出了一种猜想:方程x z-y t=1没有大于1的正整数解,除非平凡情形32-23=1。这一问题至今尚未解决。

(mathoe注:即除了8、9这两个连续正整数都是正整数的方幂外,没有其他。1962年我国数学家柯召以极其精湛的方法证明了不存在三个连续正整数,它们都是正整数的方幂,以及方程x2-y n=1,n >1,xy≠0无正整数解。并且还证明了如果卡特兰猜想不成立,其最小的反例也得大于1016。)

此外,卡特兰还在函数论、伯努利数和其他领域也做出了一定的贡献。

卡特兰通过解决凸n边形的剖分得到了数列C n。

凸n+2边形用其n-1条对角线把此凸n+2边形分割为互不重叠的三角形,这种分法的总数为C n。为纪念卡特兰,人们使用“卡特兰数”来命名这一数列。

据说有几十种看上去毫不相干的组合计数问题的最终表达式都是卡特兰数的形式。

卡特兰数在数学竞赛、信息学竞赛、组合数学、计算机编程等都会有其不同侧面的介绍。

前几个卡特兰数:规定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条弦,且这些弦两两不相交的方式数为卡特兰数C n。

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个卡特兰数C n。

再一个卡特兰数的例子

一个汽车队在狭窄的路面上行驶,不得超车,但可以进入一个死胡同去加油,然后再插队行驶,共有n辆汽车,问共有多少种不同的方式使得车队开出城去?

答:得数是第n个卡特兰数C n。

卡特兰数

求证:卡特兰数C n是整数。

证明:

①取整函数不等式:对任意实数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题考了一个卡特兰恒等式的应用的题目

卡特兰数的几个应用

《编程之美》中提到了“买票找零”问题,查阅了下资料,此问题和卡特兰数Cn有关,其定义如下:

卡特兰数真是一个神奇的数字,很多组合问题的数量都和它有关系,例如:

一.Cn= 长度为2n的D yck words的数量。D yck words是由n个X和n个Y组成的字符串,并且从左往右数,Y的数量不超过X,例如长度为6的D yck words为:

XXXYYY XYXXYY XYXYX Y XXYYXY XXYX YY

二.Cn= n对括号正确匹配组成的字符串数,例如3对括号能够组成:

((())) ()(()) ()()() (())() (()())

三.Cn= n+1个数相乘,所有的括号方案数。例如,4个数相乘的括号方案为:

((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))

\四.Cn= 拥有n+1 个叶子节点的二叉树的数量。例如4个叶子节点的所有二叉树形态:

五.Cn=n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数,例如,4×4方格地图中的路径有:

六.Cn= n+2条边的多边形,能被分割成三角形的方案数,例如6边型的分割方案有:

七.Cn= 圆桌周围有2n个人,他们两两握手,但没有交叉的方案数。

在《Enumerative Combinatorics》一书中,竟然提到了多达66种组合问题和卡特兰数有关。

卡特兰数的变种:

/problem.php?pid=1581

Problem 1581 球迷购票问题

Accept: 181 Submit: 783

Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description

球赛门票的售票处规定每位购票者限购一张门票,且每张门票售价50元。购票者中有m位手持50元钱币,另有n人手持100元。假设售票处开始售票时无零钱。问这m+n人有几种排队方式可使售票处不致出现找不出钱的局面。

对给定的m,n(0<=m,n<=5000),计算出排队方式总数。

Input

第一行为测试数据的个数T,接下的T行,每行有两个整数m和n。

Output

对每一组测试数据输出方案数。

Sample Input

3 3 2 2 0 1 1

Sample Output

5 1 1

球迷购票问题

求解M != N的情况,我们可以参考求Catalan数的方法,以下我们从组合数学上来推导:

很显然50元的进入售票处我们可以看做+1,如果100元的进入则可以看做-1。如果有m个+1和n个-1时,这个问题的目标就是求:

序列A[1]A[2]A[3]...A[m+n],满足约束条件是A[1]+A[2]+A[3]+ ... A[k] > = 0 (k <= m+n)

考虑所有m+n个数的序列有(m+n)!/(m!*n!) = C(m+n,n)个,再利用加法原理扣出其中不要求的。对于一个不合法的序列,存在着一个最小的k满足,A[1]+A[2]+...A[k] < 0.因为k是不合法序列中最小的项,所以可以断定A[1]+A[2]+...A[k-1] = 0,即前k-1项中有相同的+1和-1,且A[k] = -1(且k必为奇数)。如我们把前k项都取相反数(-A[k] = 1,前k-1项还是有相同的个数+1和-1),新生成的序列则共有(m+1)个+1和(n-1)个-1。并且可以证明一个不合要求的序列和有(m+1)个+1和(n-1)个-1的序列是一一对应的,所以不合法的序列有C(m+n,n-1) =

(m+n)!/((m+1)!(n-1)!)种。故本题的解是:

C(m+n,n)-C(m+n,n-1) =

m-n+1

------- * C(m+n,n)

m+1

排队序列总数就计算C(m+n,n) * (m-n+1)/(m+1)的值。

还没有结束...可以发现这个问题的规模很大:

在存储空间上:我们需要自己做高精度的整数类型和相应使用到的运算来求那个式子的值;

在计算时间上:我们需要更快的方法来求组合数C(a,b)的值,因为直接利用C(a,b) = a!/(b! * (a-b)!)来求的效率很显然是太低了,所以还需要一些技巧还实现求解组合数。

到此问题的算法已经得出来了,往下该考虑如何编程和优化代码。

分析

可以看成是坐标系中,从(0,0)点走到(m, n)点,并且跟y=x-1这条直线不相交的方案数。(0,0)点关于直线y=x-1的对称点是(1,-1),从(1,-1)点走到(m, n)点的所有方案均一定会与直线y=x-1相交,对于这些方案,将从(1,-1)点到与y=x-1的第一个交点之间的路径关于y=x-1对称翻转过去,就可以得到所有不满足题意的从(0,0)点走到(m, n)点的方案,于是最终答案就是C(n+m, n)-C(n+m,m-1)。

stirling 数

第一类斯特灵数

s(4,2)=11

第一类Stirling数是有正负的,其绝对值是n个元素的项目分作k个环排列的方

法数目。常用的表示方法有。

换个较生活化的说法,就是有n个人分成k组,每组内再按特定顺序围圈的分组方法的数目。例如s(4,2):

1{A,B},{C,D}

2{A,C},{B,D}

3{A,D},{B,C}

4{A},{B,C,D}

5{A},{B,D,C}

6{B},{A,C,D}

7{B},{A,D,C}

8{C},{A,B,D}

9{C},{A,D,B}

10{D},{A,B,C}

11{D},{A,C,B}

这可以用有向图来表示。给定s(n,0) = 0,s(1,1) = 1,有递归关系

其实就是一个很土的DP,n+1个人排成K个环,首先可以把第n+1个人单独放出来,方案数为s(n,k-1) 也可以把他塞到某个环里面,于是就有n*s(n,k)种...

第二类斯特灵数

第二类Stirling数是n个元素的集定义k个等价类的方法数目。常用的表示方法

有。

换个较生活化的说法,就是有n个人分成k组的分组方法的数目。例如有甲、乙、丙、丁四人,若所有人分成1组,只有所有人在同一组这个方法,因此S(4,1) = 1;若所有人分成4组,只可以人人独立一组,因此S(4,4) = 1;若分成2组,可以是

甲乙一组、丙丁一组,或甲丙一组、乙丁一组,或甲丁一组、乙丙一组,或其中三人同一组另一人独立一组,即是:

12{A,B},{C,D}

13{A,C},{B,D}

14{A,D},{B,C}

15{A},{B,C,D}

16{B},{A,C,D}

17{C},{A,B,D}

18{D},{A,B,C}

因此S(4,2) = 7。

给定S(n,n) = S(n,1) = 1,有递归关系S(n,k) = S(n? 1,k? 1) + kS(n? 1,k) 这个DP就更土了,把第n个人拿出来,有s(n-1,k-1)种,既n-1个人求k-1堆

然后把第n个人随便塞到这k个群里面,k个情况,而等待被插的人是n-1,k*s(n-1,k dp[i][j]=dp[i-1][j-1]+dp[i-1][j];

dp[i][0]=1;

表示把一个集合划分成若干个等价类的种类数

既第二类stirling数的累加

Bell 数

2.就是把N个不同的球放到M个不同的箱子,箱子不为空的数量,

递推关系式是:

S[n][m] = m * s[n-1][m] + s[n-1][m-1];

Bell数,又称为贝尔数。

//重要公式:B(n+1) = Sum(0,n) C(n,k)B(k). n = 1,2,...S(n,k) = S(n-1,k-1) + kS(n-1,k). B(n) = Sum(1,n) S(n,k).

是以埃里克·坦普尔·贝尔(Eric Temple Bell)为名的。

B(n)是包含n个元素的集合的划分方法的数目。

B(0) = 1, B(1) = 1, B(2) = 2, B(3) = 5, //贝尔数是集合划分可以有空集而第二类stirling数有严格限制不能有空集

B(4) = 15, B(5) = 52, B(6) = 203,...

递推公式为,

B(0) = 1,

B(n+1) = Sum(0,n) C(n,k)B(k). n = 1,2,...

其中,Sum(0,n)表示对k从0到n求和,C(n,k) = n!/[k!(n-k)!]

-------------------------

Stirling数,又称为斯特灵数。

在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的。

第一类Stirling数是有正负的,其绝对值是包含n个元素的集合分作k个环排列的方法数目。

递推公式为,

S(n,0) = 0, S(1,1) = 1.

S(n+1,k) = S(n,k-1) + nS(n,k)。

第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。

递推公式为,

S(n,n) = S(n,1) = 1,

S(n,k) = S(n-1,k-1) + kS(n-1,k).

-------------

bell数和stirling数的关系为,

每个贝尔数都是"第二类Stirling数"的和。

B(n) = Sum(1,n) S(n,k).

stirling公式(n!的近似公式)

int stirling(int n)

{

const double p=acos(-1.0);

double c1=log10(2*p);

double c2=0.434294481903;

double c3=log10(1.0*n);

int s=1;

if(n>3)

s=(c3+c1)/2+n*(c3-c2)+1;

return s;

}

sum=n*(log10(double(n))-log10(double(2.718281828459)))+log10(2*3.1415926 53)/2+log10(double(n))/2;

return int(sum)+1;

N!近似于(2*pi*n)~0.5*(n/e)~n

相关文档
最新文档