组合数学基础

这篇博客总结了组合数学中的核心概念,包括加法原理、乘法原理、鸽巢原理、容斥原理、线排列、相异元素可重排列、不全相异元素排列、圆排列、非重组和以及Lucas定理。作者强调了这些理论在实际问题解决和编程实现中的重要性,并提到了Catalan数列在特定序列问题中的应用。博客指出,理解和熟练运用组合数学对于算法刷题和问题解决至关重要。
摘要由CSDN通过智能技术生成


  这周虽然说有个国庆小假期在,但我们那天本来就没课。而且因为这周发生了一些意外的事,导致这周的训练任务做的不怎么到位(基本都是几个没课的小空闲时间学习的),就连这周讲课也没能去听下(那可是我的舍友)。
当然,数论其实本来打算是要刷点题的,不过实在没能打起精神来。cf的比赛也是报名了又退了,越来越熬不住了。
不过这周原本就打算看下组合数学相关的东西的。其实先前也是大体浏览过这方面的东西的,不过并没有详细看下,这里就小小的总结下吧。
1.加法原理,乘法原理:
  可以说是最基本的了。不过仍要注意,加法原理要注意相加的各项要求不会重合(不是说的相同,有可能是部分重合),乘法原理注意各项间互不影响(比如存在选取的先后顺序等可能存在后效性问题)。
2.鸽巢原理:
  多余n只鸽子放入n个鸽巢中,必然有至少一个鸽笼有两只或以上只鸽子。看起来定理似乎有点废话,但能不能马上反应过来还不是那么容易的事。其实碰到实际问题不会单纯这样,通常应用的关键在于想出如何去构建一个“鸽巢”。
3.容斥原理:
  在数论方面时就曾经用到过,用一句话来说就是直接相加再减去重复的。其实我倒觉得这一理论不比总结出固定的去重方法,实际问题中不见得能够套用,全面考虑问题细心点就好。
4.线排列:
  其实也是对已掌握的知识的一种重新的认知,其实所谓的全排列A(n,n)不过是一种线排列特殊情况。而线排列即是从n个元素中选取m个元素,存在的所有可能排列为A(n,m)= n!/(n-m)!,即C(n,m)×m!先选出再全排列。
5.相异元素可重排列:
  看着高大上的名字其实反而很简单内容,其实就是自然而然就知道的。即从n种元素种可重复的选取m个排列,结果数为n^m种。
6.不全相异元素排列:
  在n个元素中,有你n1个元素彼此相同,有n2个元素彼此相同……有nm个元素彼此相同,则这n个元素的全排列为n!/(n1!×n2!×~~×nm!)。注意,是全排列。其实这个才是最麻烦的,因为它会自然而然的存在除法,而且很难转化成不带除法的式子计算。要知道,涉及排列组合的结果通常很大需要取余运算,而除法存在就限制了取余的进行。一旦某个数无法求解逆元将会是个很麻烦的事。
7.圆排列:
  n个元素中取出m个来排成一个圆圈,所有可能的排列方法有n!/(m×(n-m)!),自然,n=m时即全圆排列即为(n-1)!。
8.非重组和:
  即n个元素中选出m个来,即C(n,m)即n!(m!*(n-m)!)。其中C(n,0)=C(n,n)=1。此外还有性质:C(n+1,m)=C(n,m)+C(n,m-1)。变换一下即:C(n,m)=C(n-1,m)+C(n-1,m-1),由此递推公式可以线性直接打表求得一系列组合数。
9.Lucas定理:
  C(n,m)%p(p为质数)=C(n/p,m/p)*C(n%p,m%p)%p。类似欧拉定理那样通过取余数进行处理化繁为简,而较小的组合数可以直接求解或者小型的线性打表获得。不过如果P非常大(尤其比m,n还要大)时就不适用了(取余就没用了)。
10.Catalan数列:
  给定n个0和n个1,组成长度2n的数列,满足任意前缀中0的个数不少于1的个数的序列数为CATn=C(2n,n)/(n+1)。当然,这就是解决特殊序列问题的,类似的特殊序列还有:
  其实组合数的求解倒没有多么复杂,解决的问题关键还是在于得到组合式本身,同时不同思路得出的组合式或许都是对的,但不见得相同程度易于编程实现,所以从多角度思考问题非常关键。另外,组合数学的理论还可能由其它多种应用,曾经做题时就有过经验,其实通过类似组合数学的思想考虑下问题会让问题结构清晰,也有可能直接找到解题思路,在动态规划这种类似求解某种递推式的问题中很明显。当然,要熟练应用,需要刷题啊……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值