组合数学
组合数学例题和知识点总结

组合数学例题和知识点总结组合数学是一门研究离散对象的组合结构及其性质的数学分支。
它在计算机科学、统计学、物理学等领域都有着广泛的应用。
下面我们通过一些例题来深入理解组合数学中的重要知识点。
一、排列组合排列是指从给定的元素集合中取出若干个元素按照一定的顺序进行排列。
组合则是指从给定的元素集合中取出若干个元素组成一组,不考虑其顺序。
例题 1:从 5 个不同的元素中取出 3 个进行排列,有多少种不同的排列方式?解:根据排列的公式,\(A_{5}^3 = 5×4×3 = 60\)(种)例题 2:从 5 个不同的元素中取出 3 个进行组合,有多少种不同的组合方式?解:根据组合的公式,\(C_{5}^3 =\frac{5×4×3}{3×2×1} =10\)(种)知识点总结:1、排列数公式:\(A_{n}^m = n×(n 1)×(n 2)××(n m + 1)\)2、组合数公式:\(C_{n}^m =\frac{n!}{m!(n m)!}\)二、容斥原理容斥原理用于计算多个集合的并集的元素个数。
例题 3:在一个班级中,有 20 人喜欢数学,15 人喜欢语文,10 人既喜欢数学又喜欢语文,求喜欢数学或语文的人数。
解:设喜欢数学的集合为 A,喜欢语文的集合为 B,则喜欢数学或语文的人数为\(|A ∪ B| =|A| +|B| |A ∩ B| = 20 + 15 10= 25\)(人)知识点总结:容斥原理的一般形式:\(|\cup_{i=1}^{n} A_i| =\sum_{i=1}^{n} |A_i| \sum_{1\leq i < j\leq n} |A_i ∩ A_j| +\sum_{1\leq i < j < k\leq n} |A_i ∩ A_j∩ A_k| +(-1)^{n 1} |A_1 ∩ A_2 ∩ ∩ A_n|\)三、鸽巢原理鸽巢原理也叫抽屉原理,如果有 n + 1 个物体放入 n 个抽屉中,那么至少有一个抽屉中会放有两个或更多的物体。
组合数学的基本概念和计算

组合数学的基本概念和计算组合数学是数学中的一个重要分支,研究的是离散的、可数的对象的组合方式和性质。
其主要研究对象有排列、组合、二项式系数等。
在各个领域中都有广泛的应用,尤其在图论、密码学、统计学等方面起着重要作用。
本文将介绍组合数学的基本概念和计算方法。
一、排列排列是指从n个不同元素中取出m个元素进行排列组合的方式。
排列的顺序是有意义的,即不同的顺序对应不同的排列方式。
排列数的计算可以使用阶乘的方式,即P(n,m)=n!/(n-m)!二、组合组合是指从n个不同元素中取出m个元素进行组合的方式。
组合的顺序是无意义的,即不同的顺序对应同一种组合方式。
组合数的计算可以使用阶乘的方式,即C(n,m)=n!/[m!(n-m)!]三、二项式系数二项式系数是组合数学中的一个重要概念,表示的是二项式展开后每一项的系数。
在代数学中,二项式系数是根据二项式定理得到的,其公式为C(n,m)。
二项式系数在代数、组合、概率等领域中都有广泛的应用。
四、计算方法在组合数学中,计算组合数或者排列数有多种方法,包括直接计算法、递推法和使用公式法等。
1. 直接计算法直接计算法是最简单的方法,即根据组合数和排列数的定义,进行相应的计算。
例如,要计算C(5,2),即从5个元素中取出2个元素进行组合的方式,可以按照公式C(n,m)=n!/[m!(n-m)!]进行计算。
2. 递推法递推法是一种常用的计算方法,尤其适用于大规模计算。
递推法的基本思想是通过计算已知的组合数或排列数,推导出未知的组合数或排列数。
例如,要计算C(5,2),可以利用递推公式C(n,m)=C(n-1,m-1)+C(n-1,m)进行计算。
3. 公式法公式法是一种通过使用组合数学中的公式进行计算的方法。
例如,要计算C(5,2),可以使用二项式系数的公式C(n,m)=n!/[m!(n-m)!]进行计算。
五、应用领域组合数学在各个领域都有广泛的应用,下面介绍其中几个主要应用领域:1. 图论在图论中,组合数学的方法被广泛应用于图的着色、匹配、路径等问题的求解。
组合数学的基本概念与应用

组合数学的基本概念与应用组合数学是一门研究离散对象的排列、组合和计数等问题的数学分支。
它在许多领域都有着广泛的应用,从计算机科学到物理学,从生物学到经济学,几乎无处不在。
组合数学的基本概念包括排列、组合、二项式定理、容斥原理等。
排列是指从给定的元素集合中,按照一定的顺序选取若干个元素进行排列。
例如,从 5 个不同的数字中选取 3 个进行排列,计算方法为5×4×3 = 60 种。
组合则是从给定的元素集合中,不考虑顺序地选取若干个元素。
比如,从 5 个不同的数字中选取 3 个的组合数,计算方法为 5×4×3÷(3×2×1) = 10 种。
二项式定理在组合数学中也占据重要地位。
对于任意的正整数 n,有\((a + b)^n =\sum_{k=0}^n C(n, k) a^{n k} b^k\),其中\(C(n, k)\)表示从 n 个元素中选取 k 个元素的组合数。
容斥原理用于计算多个集合的并集的元素个数。
例如,有三个集合A、B、C,要计算它们并集的元素个数,需要先分别计算 A、B、C 的元素个数,然后减去两两交集的元素个数,再加上三个集合交集的元素个数。
组合数学在现实生活中的应用十分广泛。
在计算机科学中,组合数学的作用不可小觑。
在算法设计中,经常需要考虑各种可能性的数量和排列组合方式。
比如,在搜索算法中,需要计算搜索空间的大小,以评估算法的效率和复杂度。
在密码学中,组合数学的原理被用于生成和破解密码。
通过对密钥空间的组合分析,可以评估密码系统的安全性。
组合数学在生物学中也有应用。
在基因测序中,需要分析基因片段的排列组合,以确定基因的结构和功能。
在生物进化的研究中,组合数学可以帮助分析物种的遗传变异和多样性。
在经济学领域,组合数学被用于投资组合的优化。
投资者需要从众多的投资项目中选择一组,以在风险和收益之间达到最佳平衡。
这就涉及到对不同投资项目组合的可能性和收益风险的计算。
组合数学pdf

组合数学
组合数学是数学中的一个分支,研究如何选出一些元素组成某种集合的数学问题。
组合数学是运用较为广泛的数学分支之一,它涉及面不仅局限于数学领域,还涉及计算机科学,物理学,统计学,生物学等领域。
在日常生活中,组合数学也有很多应用,例如密码学、图论、排列组合等方面。
组合数学主要涉及组合、排列、集合这些数学概念,下面将对这些概念逐一进行介绍。
组合数:组合数是指从n个不同元素中取r个元素(r≤n)不重不漏的所有情况的个数。
组合数可以简单地表示成C(n,r),其计算公式为:C(n,r)=n!/(r!(n-r)!)。
排列数:排列数是指从n个不同元素中取出r个元素进行排列,不放回地选取,可以表示为A(n,r),排列数的计算公式为
A(n,r)=n!/(n-r)!。
排列数也可以分为有放回排列和无放回排列。
集合:集合是由若干个元素组成的一个整体,集合内的元素没有重复且无序。
例如,{1,2,3}和{3,2,1}都代表同一个集合。
在实际应用中,组合数学的应用十分广泛。
例如在密码学中,组合数学可以用来生成密码,用来保护数据的安全性。
在图论中,组合数学可以用来研究图的结构,处理图的中间点,连通性等问题。
在排列组合中,组合问题是许多具有不同性质的排列问题的基础。
生物学中,组合数学也可以通过研究遗传物质的组合和排列等问题,来推断人类或动物的遗传基因情况。
总之,组合数学是一门综合性极强的数学学科,在实际中的应用和研究都有非常重要的地位。
组合数公式大全

组合数公式大全组合数公式是组合数学中重要的概念,它们在概率论、统计学、离散数学等领域都有广泛的应用。
组合数公式可以用来计算从n个不同元素中取出r个元素的组合数,它们的计算方法多种多样,其中包括排列组合公式、二项式定理、组合数的递推关系等。
接下来,我们将详细介绍组合数公式的各种计算方法,让我们一起来深入探讨。
一、排列组合公式排列组合公式是组合数学中最基本的概念之一,它用于计算从n个不同元素中取出r个元素的组合数。
排列组合公式的计算公式如下:C(n, r) = n! / (r! * (n-r)!)C(n, r)表示从n个不同元素中取出r个元素的组合数,n!代表n的阶乘,即n*(n-1)*(n-2)*...*1,r!代表r的阶乘,(n-r)!代表n-r的阶乘。
二、二项式定理二项式定理是组合数学中的一个重要定理,它用于计算二项式展开式中各项的系数。
二项式定理的公式如下:(a+b)^n = C(n,0)*a^n*b^0 + C(n,1)*a^(n-1)*b^1 + ... + C(n,r)*a^(n-r)*b^r + ... + C(n,n)*a^0*b^n(a+b)^n表示(a+b)的n次幂展开式,C(n,r)表示从n个不同元素中取出r个元素的组合数。
从上述公式可以看出,二项式定理可以用来计算二项式展开式中各项的系数,因此它在代数学和离散数学中有着广泛的应用。
三、组合数的递推关系组合数的递推关系是一种用来计算组合数的方法,它可以在一定程度上简化计算过程。
组合数的递推关系公式如下:C(n, r) = C(n-1, r-1) + C(n-1, r)C(n, r)表示从n个不同元素中取出r个元素的组合数,根据递推关系可以得到不同组合数之间的关系,从而简化计算过程。
以上介绍了排列组合公式、二项式定理和组合数的递推关系,它们是组合数学中常用的计算方法,对于理解和应用组合数具有重要的意义。
通过深入学习这些公式和定理,我们可以更好地理解组合数的概念,并且在实际问题中灵活运用。
组合数学课件-第一章:排列与组合

积分性质
若G(x)是母函数,则它的不定积分∫G(x)dx (其中C为常数)也是母函数。
线性性质
若G1(x)和G2(x)是两个母函数,则它们的 线性组合k1*G1(x)+k2*G2(x)(k1和k2是 常数)也是母函数。
微分性质
若G(x)是母函数,则它的导数G'(x)也是母 函数。
乘积性质
若G1(x)和G2(x)是两个母函数,则它们的 乘积G1(x)*G2(x)也是母函数。
对称性
C(n,m) = C(n,n-m),即从n个元素中取出m个元 素的组合数与从n个元素中取出n-m个元素的组 合数相等。
递推关系
C(n,m) = C(n-1,m-1) + C(n-1,m),即当前组合 数等于前一个元素在组合中和不在组合中的两种 情况之和。
边界条件
C(n,0) = C(n,n) = 1,即从n个元素中取出0个或 n个元素的组合数均为1。
典型例题解析
例1
从10个数中任取4个数,求其中最大数为6的组合数。
解析
此问题等价于从6个数(1至6)中取4个数的组合数,即 C(6,4)。
例2
在所有的三位数中,各位数字之和等于10的三位数有 多少个?
解析
此问题可转化为从9个数字(1至9)中取3个数字的组合 数,即C(9,3),然后考虑三个数字的全排列,即3!,因此 总共有C(9,3) × 3!个符合条件的三位数。
组合与排列的关系
组合数可以看作是从n个元素中取出m个元素进行排 列的种数除以m的阶乘,即C(n,m)=A(n,m)/m!。 因此,在计算组合数时也可以利用排列数和容斥原 理来进行计算。
THANKS
隔板法
将n个相同的元素分成r组的方法数可以用母函数表示为 C(n+r-1,r),其中C表示组合数。
组合数学基础知识

组合数学基础知识组合数学是一门研究离散对象的计数、排列、组合和优化等问题的数学分支。
它在计算机科学、密码学、统计学、物理学等众多领域都有着广泛的应用。
接下来,让我们一起走进组合数学的世界,了解一些它的基础知识。
首先,我们来谈谈排列与组合。
排列是指从给定的元素集合中按照一定的顺序选取若干个元素进行排列。
比如说,从 5 个不同的数字中选取 3 个进行排列,那么排列的方式就有 5×4×3 = 60 种。
而组合则是指从给定的元素集合中选取若干个元素,不考虑它们的顺序。
还是刚才的例子,从 5 个不同的数字中选取 3 个的组合方式,就有 5×4×3÷(3×2×1) = 10 种。
我们再来看一下加法原理和乘法原理。
加法原理说的是,如果完成一件事情有 n 类办法,在第一类办法中有 m1 种不同的方法,在第二类办法中有 m2 种不同的方法,……,在第 n 类办法中有 mn 种不同的方法,那么完成这件事情共有 m1 + m2 +… + mn 种不同的方法。
比如,要从 A 地到 C 地,可以先从 A 地到 B 地有 3 条路,再从 B 地到 C 地有 4 条路,那么从 A 地到 C 地就一共有 3 + 4 = 7 条路。
乘法原理则是,如果完成一件事情需要 n 个步骤,做第一步有 m1 种不同的方法,做第二步有 m2 种不同的方法,……,做第 n 步有 mn 种不同的方法,那么完成这件事情共有m1×m2×…×mn 种不同的方法。
比如,一个密码由三位数字组成,第一位可以是 0 到 9 中的任意一个数字,第二位和第三位也是如此,那么总共的密码组合就有 10×10×10 = 1000 种。
在组合数学中,还有一个重要的概念是容斥原理。
容斥原理用于计算多个集合的并集中元素的个数。
假设我们有三个集合 A、B、C,那么它们的并集中元素的个数可以通过以下公式计算:|A∪B∪C| =|A| +|B| +|C| |A∩B| |A∩C| |B∩C| +|A∩B∩C|。
组合数学知识点总结

组合数学知识点总结组合数学是一门研究离散对象的计数、排列、组合和优化等问题的数学分支。
它在计算机科学、统计学、物理学、化学等众多领域都有着广泛的应用。
下面我们来详细总结一下组合数学的一些重要知识点。
一、基本计数原理1、加法原理如果完成一件事情有 n 类办法,在第一类办法中有 m1 种不同的方法,在第二类办法中有 m2 种不同的方法,……,在第 n 类办法中有mn 种不同的方法,那么完成这件事情共有 N = m1 + m2 +… + mn种不同的方法。
2、乘法原理如果完成一件事情需要 n 个步骤,做第一步有 m1 种不同的方法,做第二步有 m2 种不同的方法,……,做第 n 步有 mn 种不同的方法,那么完成这件事情共有 N =m1 × m2 × … × mn 种不同的方法。
这两个原理是组合数学中最基本的原理,许多计数问题都可以通过这两个原理来解决。
二、排列与组合1、排列从 n 个不同元素中取出 m(m ≤ n)个元素的排列数,记为 A(n, m),其计算公式为:A(n, m) = n! /(n m)!例如,从 5 个不同的元素中取出 3 个元素进行排列,排列数为 A(5, 3) = 5! /(5 3)!= 602、组合从 n 个不同元素中取出 m(m ≤ n)个元素的组合数,记为 C(n, m),其计算公式为:C(n, m) = n! / m! (n m)!例如,从 5 个不同的元素中取出 3 个元素的组合数为 C(5, 3) = 5!/ 3! (5 3)!= 10组合与排列的区别在于,排列考虑元素的顺序,而组合不考虑元素的顺序。
三、容斥原理容斥原理用于计算多个集合的并集中元素的个数。
设A1, A2, …, An 是有限集合,其元素个数分别为|A1|,|A2|,…,|An|,则它们的并集的元素个数为:|A1 ∪ A2 ∪ … ∪ An| =∑|Ai| ∑|Ai ∩ Aj| +∑|Ai ∩ Aj ∩Ak| … +(-1)^(n 1) |A1 ∩ A2 ∩ … ∩ An|容斥原理在解决包含与排除问题时非常有用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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种,是卡特兰数C41936第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=1581Problem 1581 球迷购票问题Accept: 181 Submit: 783Time 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 Input3 3 2 2 0 1 1Sample Output5 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)。