码迷,mamicode.com
首页 > 其他好文 > 详细

组合数学

时间:2019-10-17 20:23:46      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:组合   cat   方法   取整   多项式   多少   乘法   原理   一个人   

排列组合

排列

\(n\)个不同的元素中取出\(m\)个的方案数,记为\(A(n,m)\)\(P(n,m)\)
\[P(n,m)=\frac{n!}{(n-m)!}\]

组合

\(n\)个相同的元素中取出\(m\)个的方案数,记为\(C(n,m)\)
\[C(n,m)=\frac{n!}{m!(n-m)!}\]
\[C(n,m)=C(n-1,m)+C(n-1,m-1)\]

隔板法

\(m-1\)个相同隔板把\(n\)个相同元素分成\(m\)部分(可以有两个隔板插在同一个空隙)
方案数:\[C(n+m-1,m-1)=C(n+m-1,n)\]

卡特兰数

一个序列有n个0和n个1,保证每个1之前必有1个0的方案数为C(n)
递推式:(注意:括号里只有一个元素的是Catalan数,有两个元素的是组合数)
\[C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)*C(0)\]
\[C(n)=C(n-1)*(4*n-2)/(n+1)\]
\[C(n)=C(2n,n)/(n+1)\]

\[C(n)=C(2n,n)-C(2n,n-1)\]

第一类斯特林数

\(n\)个元素摆成\(m\)个圆排列的方案数,记为\[s(n,m)\]
递推式:\[s(n,m)=s(n-1,m-1)+(n-1)*s(n-1,m)\]

第二类斯特林数

\(n\)不同的球放在\(m\)个相同的盒子(无空盒)里的方案数,记为\[S(n,m)\]
递推式:\[S(n,m)=S(n-1,m-1)+m*S(n-1,m)\]

母函数(生成函数)

引入:砝码称重问题

有1g砝码5个,2g砝码3个,5g砝码2个。相同质量的砝码完全相同。问有多少种能称出15g的方案?

解:
很容易想到暴力枚举每一种可能的称量方案,但是时间复杂度为\(O(n^n)\)级别,计算机无法承受。于是我们引入母函数的概念。设\(G(x)\)为母函数,对于1g的砝码能称出的不同重量,我们用多项式表示为\[(x^1+x^2+...+x^{15})\]同理,2g砝码能表示为\[(x^2+x^4+...+x^{14})\]5g砝码能表示为\[(x^5+x^{10}+x^{15})\]
于是\[G(x)=(x^1+x^2+...+x^{15})(x^2+x^4+...+x^{14})(x^5+x^{10}+x^{15})\]
经过化简,求出\(x^{15}\)的系数,即为答案。

由于只需化简多项式,母函数的时间复杂度仅为\(O(n^3)\),空间复杂度为\(O(n)\),得到巨大提升。
使用fft可以进一步优化。

错位排列

递推式:\[f[n]=(n-1)*(f[n-1]+f[n-2])\]

\(n\) 很大时, \(f[n] \approx \frac{n!}{e}\)

证明:

  1. \(n-1\) 个人已经完成错排,第 \(n\) 个人和任意一个人交换
  2. \(n-1\) 个人中的一个和第 \(n\) 个人交换,其余 \(n-2\) 个人已经完成错排

经典的放球问题

为方便表达,我们设方案数为\(N\)\(n\)个球,\(m\)个盒

1. 球不同,盒不同,有空盒

\[N=m^n\]
根据乘法原理可得。

2. 球不同,盒不同,无空盒

(1) \(n>=m\)
\[N=m!*S(n,m)\]
球不同,盒相同的方案数\(\times m!\)

(2) \(n<m\)
\[N=0\]

3. 球不同,盒同,有空盒

\[N=S(n,1)+S(n,2)+...+S(n,m)\]
因为允许空盒,所以球可以只放在\(m\)个盒中的\(1\)个或\(2\)个或...或\(m-1\)个盒中

4. 球不同,盒同,无空盒

(1) \(n>=m\)
\[N=S(n,m)\]
由第二类斯特林数的定义。

(2) \(n<m\)
\[N=0\]

5. 球同,盒不同,有空盒

\[N=C(m+n-1,n)\]
插板法,即把\(n\)个球用\(m-1\)个隔板分成\(m\)部分。

6. 球同,盒不同,无空盒

(1) \(n>=m\)
\[N=C(n-1,m-1)\]
先在每个盒子里放一个球,方案数为\(1\);再对剩下的\(n-m\)个球用隔板法,即把\(n-m\)个球用\(m-1\)个隔板分成\(m\)部分。

(2) \(n<m\)
\[N=0\]

7. 球同,盒同,有空盒

(1) \(n>=m\)

我们发现,当\(n=5,m=3\)时的方案为:

5 0 0

4 1 0

3 2 0

3 1 1

2 2 1

\(5\)种方案。

我们发现,问题可以转化为:把正整数\(n\)分解成不超过\(m\)个自然数的方案数。如果暴力dfs,时间复杂度为\(O(\)爆炸\()\)竟然还有70分

有一个重要结论:把正整数\(n\)分解成不超过\(m\)个自然数的方案数,等于把正整数\(n\)分解成若干个\(\le m\)的自然数的方案数。这个定理的证明方法,请自行百度。(我也不会)

我们考虑使用母函数:对于分解出的每个\(\le m\)的整数\(i\),我们用多项式表示为\[(x^i+x^{2i}+...+x^{floor(\frac{n}{i})*i})\]

此处\(floor(x)\)表示\(x\)向下取整。

于是,母函数\(G(x)\)\[G(x)=\prod_{i=1}^{m}(x^i+x^{2i}+...+x^{floor(\frac{n}{i})*i})\]

求出\(x^n\)的系数即可。

(2) \(n<m\)

\[\color{white}{???}\]

8. 球同,盒同,无空盒

(1) \(n>=m\)

母函数\[G(x)=\prod_{i=1}^{m}(x^i+x^{2i}+...+x^{floor(\frac{n}{i})*i})\]

\(x^{n-m}\)的系数。

(2) \(n<m\)
\[N=0\]

组合数学

标签:组合   cat   方法   取整   多项式   多少   乘法   原理   一个人   

原文地址:https://www.cnblogs.com/BlogOfchc1234567890/p/11694668.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!