前言
(quad)可以说是洛谷日报——当小球遇上盒子的学习笔记吧,做了一点简化和说明。
(quad)毕竟是一个下午学习完的,比较粗糙,见笑了。
(quad)洛谷日报原文地址:https://www.luogu.com.cn/blog/chengni5673/dang-xiao-qiu-yu-shang-he-zi
排列
A
(quad)这个东西比较简单,大概就是我给你一些数,然后要你求有多少种不同的排列方式。
(quad)那我们假设一下有(n)个数,要将他排列,怎么搞?
(quad)那必然是先枚举第一个位置放入的数,然后再枚举第二个位置放入的数巴拉巴拉这样子放下去。
(quad)显然,第一个位置可以选择(n)个数,第二个位置(n-1)个数,第三个(n-2)个,以此类推。
(quad)然后根据乘法原理显然答案就是(n!)。
(quad)这种(n)个位置放入(n)个数的,我们写成(A^{n}_{n}),那么我们就有(A^{n}_{n}=n!)。
(quad)那么我们再深入思考一下,如果我们只有m个位置呢?
(quad)那显然就是:(A^{n}_{m}=(n)*(n-1)*(n-2)*...*(n-m+1)=frac{n!}{(n-m)!})
(quad)再做一个引入,我们考虑将这些数排到一个环上,有多少种方案呢?
(quad)考虑到环是首尾相接的,所以说答案是:(ans = frac{A^{n}_{m}}{n})。
(quad)很好理解对不对,那么接下来的东西就难不到你了。
第一类斯特林数(S1)
(quad)第一类斯特林数的概念是将一些数分配到一些环上有多少种方法。
(quad)(S1[n][k])表示将(n)个数分配到(k)个环上有多少种分法。
(quad)那么显然我们有
- 初值:(s[1][1]=1)
- 递推式:(s[n][k]=s[n-1][k-1]+s[n-1][k]*(n-1))
(quad)你这么聪明应该不需要解释吧初值显然,递推式的含义就是新加的数可以单独成环也可以放在原有的任何一个数的后面。
组合
C
(quad)这东西就是告诉你,现在你不但要排列,而且这些数字是没有顺序的。
(quad)就是说你的方案都应该保证数字是从小到大排列的。
(quad)那这好说啊,我们考虑到一个长度为(m)的排列所有数字相同的情况有(A^{m}_{m})种禁止套娃。
(quad)那么这个组合的情况不就是(C^{n}_{m}=frac{A^{n}_{m}}{A^{m}_{m}})吗?
(quad)那不就有:(C^{n}_{m}=frac{A^{n}_{m}}{A^{m}_{m}}=frac{A^{n}_{m}}{m!}=frac{frac{n!}{(n-m)!}}{m!}=frac{n!}{(n-m)!*m!})
(quad)完美。
隔板问题
(quad)现在我们来考虑一个问题,我们要将(n)个小球隔成(m)段,每段不能为空,有多少种隔断法?
(quad)那么显然,我们会发现如果我们将(n)个小球的所有间隙拿出来组合一下,有多少种组合方法就有多少种方案,显然答案是:(C^{n-1}_{m-1})
(quad)现在我们终于可以开始考虑小球和盒子的问题了!
(quad)后续问题都假设有(n)个小球与(m)个盒子
小球相同,盒子不相同,盒子不可为空
(quad)显然因为小球相同,盒子不相同,所以说我们就可以考虑直接把小球分成(m)段,每段的放到对应编号的盒子里,有多少种不同的分法就是答案。
(quad)那么这个东西就和上面的问题一毛子一样,答案就是(C^{n-1}_{m-1}),显然可以保证不重不漏(这个是非常重要的原则)!
小球相同,盒子不相同,盒子可以为空
(quad)我们只需要在上面分的时候给每一段都加一个小球,然后分完之后再拿掉就完成了。
(quad)答案是:(C^{n+m-1}_{m-1})
小球不相同,盒子不相同,盒子可以为空
(quad)那么显然,对于每一个小球,都有(m)种选择,答案就是(m^{n})
第二类斯特林数(S2)
(quad)开始深入了哈。
小球不相同,盒子相同,盒子不可为空
(quad)这个东西比较难搞哎。我们先考虑小球不同,盒子不同,盒子可以为空的那个东西:(m^{n})
(quad)那我们再一次考虑,假设它空了(k)个盒子,相较与不可以空会多出多少种方案。
(quad)显然我们多出的方案就是少了这些盒子的方案也就是((m-k)^{n}),考虑到不确定到底是那些盒子所以要变成(C^{m}_{k}*(m-k)^{n})。
(quad)然后我们枚举从少(0)个到少(m)个,考虑到有重复所以要用容斥原理,那么我们就得到了小球不相同,盒子不相同,盒子不可以为空的东西(sum_{k=0}^{m}{(-1)^{k}*C^{m}_{k}*(m-k)^{n}})
(quad)我们把它变成盒子相同只要除一个(A^{m}_{m})就好了,即
- (s2[n][m]=frac{1}{m!}*sum_{k=0}^{m}{(-1)^{k}*C^{m}_{k}*(m-k)^{n}})。
(quad)同时我们也可以得到第二类斯特林数的递推式:
- 初值:(s2[1][1] = 1)
- 递推式:(s2[n][m] = s2[n-1][m]*m+s2[n-1][m-1])
小球不相同,盒子不相同,盒子不可为空
(quad)这个东西我们在上面推过了~
(quad)(ans = sum_{k=0}^{m}{(-1)^{k}*C^{m}_{k}*(m-k)^{n}} = m!*s2[n][m])
贝尔数
(quad)再深入一点啦~
小球不相同,盒子相同,盒子可以为空
(quad)显然,第二类斯特林数要求盒子不可以为空,这个盒子可以为空,那么我们将第二类斯特林数无脑堆叠起来不就可以了?
(quad)(ans = sum_{i=1}^{m}{s2[n][i]})
(quad)这个东西叫做贝尔数,但有一点点区别。
(quad)贝尔数的定义为:第(n)个Bell数表示集合({1,2,...,n})的划分方案数。
(quad)显然这个东西为(Bell_{n}=sum_{i=1}^{n}{s[n][i]})
(quad)同时它也有递推公式:
- 初值:(Bell_{1}=1)
- 递推式:(Bell_{n}=sum_{i=1}^{n-1}{C^{n-1}_{i}*Bell_{i}})
(quad)关于递推式的解释:我们假设这个数分到的区间的大小为(i),这样子这个数放到分到区间的方案数就是(C^{n-1}_{i}),对应的,其他区间剩下的数的划分方案为(Bell_{n-1-i})
(quad)但是因为组合数的对称性,我们可以吧(C^{n-1}_{i}=C^{n-1}_{n-1-i})那么综合一下就是(Bell_{n} = sum_{i=1}^{n-1}{C^{n-1}_{i}*Bell_{i}})
最后的最后
(quad)快要结束了哦,因为这两个数没有对应的数可能是我不会,就单独划开来了!
球相同,盒子相同,可以有空盒
(quad)直接考虑递推式吧:
- 初值:(f[0][m] = f[n][1] = 1)
- 递推式:(f[n][m] = egin{cases}f[n][n]&n<m\f[n-m][m]+f[n][m-1]&nge mend{cases})
(quad)初值显然,对于盒子比球多的情况,那么显然求是放不满盒子的,而且显然不会超过(n)个盒子,所以可以从(f[n][n])处转移。
(quad)对于盒子比球少的情况,当所有盒子都放满的时候,(当前的方案数=所有盒子少一个球的方案数)也就是从(f[n-m][m])转移。
(quad)再者就是盒子没有放满时的方案数,那么显然就是从(f[n][m-1])处转移啦!
球相同,盒子相同,不可有空盒
(quad)我们先把(n)个球拿出(m)个,每个盒子里放一个,然后再就变成了上面的问题啦,所以说:
- (ans = f[n-m][m])
总结
(quad)本大菜鸟总算是好好的学习了一下组合数学啊,不容易啊!