组合计数
组合计数
关于排列组合是真的头疼...这里总结一下相关的知识点...都是简单的..
首先从最基础的开始
1.加法原理
若完成一件事的方法有\(n\)类,其中第\(i\)类的党发包括\(a_i\)种不同的的方法,且这些方法互不重合,则完成整件事共有\(a_1+a_2+a_3+\cdots+a_n\)种不同的方法。
这个应该很好理解吧!就是将整件事情分成若干类,由于每一类都能独立的王成这一件事情,所以将所有的\(a_i\)相加就行了。
2.乘法原理
若完成一件事需要\(n\)个步骤,其中第\(i\)个步骤有\(a_i\)种不同的的完成方法,且这些步骤互不干扰,则完成这件事共有\(a_1+a_2+a_3+\cdots+a_n\)种不同的方法。
这个也还行,每个步骤都是整件事情的一部分,当其他的步骤不变时,其中一个步骤有\(a_i\)中选择,这样他的贡献就是\(ans*a_i\),所以总的答案贡献就是所有的\(a_i\)相乘。
小结:其实加法原理和乘法原理不同点就在于到底是分成\(n\)类还是\(n\)个步骤,换句话说就是考虑你这\(n\)个事情到底能独立的解决整件事情还是整件事情的一部分。
3.排列数
从n个元素中依次选出m个元素排成一列,产生的不同排列的数量为:
这个证明还是很简单的,我们依次考虑去选这\(m\)个元素,将整件事分成对\(m\)个步骤,第一个元素我们可以从\(n\)个元素中任选其一,则\(a_1=n\),第二个元素只能从\(n-1\)个元素中选择其一,所以\(a_2=n-1\),一直这样到第\(m\)个元素,那时我们已经选了\(m-1\)个元素,所以只剩下\(n-m+1\)个元素,则\(a_m=n-m+1\),这很明显是乘法原理,所以我们将他们相乘就行。
4.组合数
从n个不同的元素中取出\(m\)个组成一个集合(不考虑顺序),产生的不同的集合数量为
这个证明是由排列数推出来的,首先要知道\(m\)元素的全排列为\(m!\).这个用推排列数的方法容易推得.由于排列数有顺序,而组合数不考虑顺序,所以我们在排列数的基础上消去顺序的影响就行了,每一种\(m\)个元素的集合由于顺序的缘故会有\(m!\)种方案,但这\(m!\)种方案在组合数种只算一种,所以需要除以\(m!\)就行了。所以\(C_n^m=\frac{A^m_n}{m!}\).
性质:
1.\(C_n^m=C^{n-m}_n\)
证明:
由组合数的定义,从n个元素中选m个元素组成的集合和未选剩下的集合是一一对应的,所以方案数是相等的。
2.\(C_n^m=C_{n-1}^m+C^{m-1}_{n-1}\)
证明:
我们可以考虑第\(n\)个元素选不选,分成两类,如果选的话,我们只需要在剩下的\(n-1\)个元素中选择\(m-1\)个元素就行,方案数为\(C_{n-1}^{m-1}\).如果不选,我们就需要在剩下的\(n-1\)个元素中选择\(m\)个元素,方案数为\(C_{n-1}^m\)。符合加法原理,相加即可。
3.\(C_n^0+C_n^1+C_n^2+\cdots+C_n^n=2^n\)
证明:
从\(n\)个不同的元素选出若干个元素组成一个集合(可以不选),一共有n+1类方法,分别是取走\(0,1,2,\cdots,n\),这\(n+1\)类方法的方案数分别是相对应得组合数。符合加法原理,全部相加。但从另一个方法去想,每一个元素都有选和不选两种选择,符合乘法原理,\(n\)个2相乘,答案为\(2^n\).
对于程序来说,如果要用到组合数,根据性质二,对于\(0≤x≤y≤0\)的所有组合数\(C^y_x\)直接递推出来,复杂度为\(O(n^2)\)。
比较有用和常见的是用一个数组保存阶乘,一个数组保存阶乘逆元。用到时直接用就可以了。
5.二项式定理
\({(n+m)}^n=\sum_{k=0}^n C_n^ka^kb^{n-k}\)
证明:
数学归纳法。
当\(n=1\)时,\({(a+b)}^1=C_1^0a^0b^1+C_1^1a^1b^0=a+b.\)
假设当\(n=m\)时命题成立,当\(n=m+1\)时:
证毕。
\(to\) \(be\) \(continued...\)