小球与盒子问题
- 这类问题是求解把一些小球放进一些盒子里的本质不同的方案数。
- 通过球相同/不同,盒子相同/不同,能/不能有空盒分成了8个不同的问题。
- 本篇文章会分别对这8个问题进行分析求解。
前置芝士&复习巩固
组合数 :从 n n n个物品里选出m个物品进行组合的方案数。
C n m = n ! m ! ⋅ ( n − m ) ! C_{n}^{m}=\frac{n!}{m!\cdot (n-m)!} Cnm=m!⋅(n−m)!n!排列数 :从 n n n个物品里选出 m m m个物品进行排列的方案数。
A n m = n ! ( n − m ) ! A_{n}^{m}=\frac{n!}{(n-m)!} Anm=(n−m)!n!圆排列:一个 n n n个元素构成的集合,从中选出 m m m个元素构成一个环的方案数。
Q n m = A n m m Q_{n}^{m}=\frac{A_{n}^{m}}{m} Qnm=mAnm第一类斯特林数:用 n n n个元素组成 m m m个环的方案数。
s n m = s n − 1 m − 1 + ( n − 1 ) ⋅ s n − 1 m s_{n}^{m}=s_{n-1}^{m-1}+(n-1)\cdot s_{n-1}^{m} snm=sn−1m−1+(n−1)⋅sn−1m第二类斯特林数:把一个大小为 n n n的集合划分成 m m m个非空集合的方案数,集合内部无序。
S n m = S n − 1 m − 1 + m ⋅ S n − 1 m S_{n}^{m}=S_{n-1}^{m-1}+m\cdot S_{n-1}^{m} Snm=Sn−1m−1+m⋅Sn−1m
1.球相同,盒子不同,不能有空盒
- 就是把 n n n个球分成 m m m份,每一份不能为空,插 m − 1 m-1 m−1个板即可。
a n s = C n − 1 m − 1 ans=C_{n-1}^{m-1} ans=Cn−1m−1
2.球相同,盒子不同,可以有空盒
- 把n个球分成 m m m份,每一份可以为空,再增加 m m m个球,插 m − 1 m-1 m−1个板,每一份再拿走一个球即可。
a n s = C n + m − 1 m − 1 ans=C_{n+m-1}^{m-1} ans=Cn+m−1m−1
3.球不同,盒子不同,可以有空盒
- 对于每一个球,你都可以放到 [ 1 , m ] [1,m] [1,m]的任意一个位置,由于球不同,所以球与球之间是独立的。
a n s = m n ans=m^{n} ans=mn
4.球不同,盒子不同,不能有空盒
- 对空着的位置进行容斥
- f [ i ] f[i] f[i]表示至少有i个空盒的方案数, a n s [ i ] ans[i] ans[i]表示有i个空盒的方案数
f [ i ] = ( m − i ) n ⋅ C m i f[i]=(m-i)^{n}\cdot C_{m}^{i} f[i]=(m−i)n⋅Cmi
f [ i ] = ∑ j = i m C j i ⋅ a n s [ j ] f[i]=\sum_{j=i}^{m}C_{j}^{i}\cdot ans[j] f[i]=j=i∑mCji⋅ans[j] - 二项式反演可得
a n s [ i ] = ∑ j = i m ( − 1 ) j + i C j i ⋅ f [ j ] ans[i]=\sum_{j=i}^{m}(-1)^{j+i}C_{j}^{i}\cdot f[j] ans[i]=j=i∑m(−1)j+iCji⋅f[j] - 最后答案就是 a n s [ 0 ] ans[0] ans[0],即
∑ i = 0 m ( − 1 ) i f [ i ] \sum_{i=0}^{m}(-1)^{i}f[i] i=0∑m(−1)if[i]
5.球不同,盒子相同,不能有空盒
相当于把n个元素的集合划分成 m m m份,也就是第二类斯特林数
a n s = S n m ans=S_{n}^{m} ans=Snm这个做法时间复杂度是 O ( n 2 ) O(n^{2}) O(n2)的
其实这个就是问题4的答案除以 m ! m! m!,可以用问题4的容斥
6.球不同,盒子相同,可以有空盒
- 因为可以有空盒,我们可以枚举每次一共用了几个盒子,然后把相应的第二类斯特林数加起来就可以了
a n s = ∑ i = 0 m S [ n ] [ i ] ans=\sum_{i=0}^{m}S[n][i] ans=i=0∑mS[n][i] - 这种数也叫 B e l l Bell Bell数
- B e l l Bell Bell数的定义:第 n n n个 B e l l Bell Bell数表示集合 [ 1 , 2 , 3 , . . . , n ] [1,2,3,…,n] [1,2,3,...,n]的划分方案数
B n = ∑ m = 0 n S [ n ] [ m ] B_{n}=\sum_{m=0}^{n}S[n][m] Bn=m=0∑nS[n][m]
7.球相同,盒子相同,可以有空盒
- 设 f [ n ] [ m ] f[n][m] f[n][m]表示 n n n个球放到 m m m个盒子里的方案数
i f ( n = = 0 ∣ ∣ m = = 1 ) f [ n ] [ m ] = 1 if(n==0||m==1)~~~~~~f[n][m]=1 if(n==0∣∣m==1) f[n][m]=1
i f ( n < m ) f [ n ] [ m ] = f [ n ] [ n ] if(n<m)~~~~~~f[n][m]=f[n][n] if(n<m) f[n][m]=f[n][n]
i f ( n > = m ) f [ n ] [ m ] = f [ n − m ] [ m ] + f [ n ] [ m − 1 ] if(n>=m)~~~~~~f[n][m]=f[n-m][m]+f[n][m-1] if(n>=m) f[n][m]=f[n−m][m]+f[n][m−1] - 如果球比盒子多,分为放满和不放满两种情况讨论
- 等价于自然数拆分问题
8.球相同,盒子相同,不能有空盒
- 我们首先在所有的盒子中放一个球,就转化成了问题7
a n s = f [ n − m ] [ m ] ans=f[n-m][m] ans=f[n−m][m]
以上就是盒子小球最基础的八种情况了
盒子与小球二
- N N N个有差别的盒子 ( 1 < = N < = 20 ) (1<=N<=20) (1<=N<=20)。你有 A A A个红球和 B B B个蓝球。 0 < = A < = 15 , 0 < = B < = 15 0 <= A <= 15, 0 <= B <= 15 0<=A<=15,0<=B<=15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
- A A A的放置和 B B B的放置互不影响,所以我们可以单独计算方案,最后相乘即可
- 枚举球放了 i i i个,放满了 j j j个盒子里
a n s A = 1 + ∑ i = 1 A ∑ j = 1 m i n ( i , n ) C n j ⋅ C i − 1 j − 1 ansA=1+\sum_{i=1}^{A}\sum_{j=1}^{min(i,n)}C_{n}^{j}\cdot C_{i-1}^{j-1} ansA=1+i=1∑Aj=1∑min(i,n)Cnj⋅Ci−1j−1
a n s B = 1 + ∑ i = 1 B ∑ j = 1 m i n ( i , n ) C n j ⋅ C i − 1 j − 1 ansB=1+\sum_{i=1}^{B}\sum_{j=1}^{min(i,n)}C_{n}^{j}\cdot C_{i-1}^{j-1} ansB=1+i=1∑Bj=1∑min(i,n)Cnj⋅Ci−1j−1
a n s = a n s A ⋅ a n s B ans=ansA\cdot ansB ans=ansA⋅ansB
盒子与小球三
- 有 n n n个相同的球, m m m个不同的盒子,每个盒子最多放 k k k个球 ,请计算将这 n n n个球全部放入盒子中的方案数模 1000007 1000007 1000007后的结果 , n < = 5000 n<=5000 n<=5000, m < = 5000 m<=5000 m<=5000。
- 对限制进行容斥
- f [ i ] f[i] f[i]表示至少有i个盒子放的球大于 k k k个的方案数
f [ i ] = C m i C n − i ∗ ( k + 1 ) + m − 1 m − 1 f[i]=C_{m}^{i}C_{n-i*(k+1)+m-1}^{m-1} f[i]=CmiCn−i∗(k+1)+m−1m−1 - a n s [ i ] ans[i] ans[i]表示有i个盒子放的球大于k个的方案数
a n s [ i ] = ∑ j = i m ( − 1 ) j + i ⋅ f [ j ] ans[i]=\sum_{j=i}^{m}(-1)^{j+i}\cdot f[j] ans[i]=j=i∑m(−1)j+i⋅f[j] - 答案就是 a n s [ 0 ] ans[0] ans[0],即
∑ i = 0 m ( − 1 ) i ⋅ C m i C n − i ∗ ( k + 1 ) + m − 1 m − 1 \sum_{i=0}^{m}(-1)^{i}\cdot C_{m}^{i}C_{n-i*(k+1)+m-1}^{m-1} i=0∑m(−1)i⋅CmiCn−i∗(k+1)+m−1m−1
盒子与小球四
- 给定 n n n个各不相同的小球,和 m m m个不同的 B O X BOX BOX,有多少种不同的放球方法,使得每个 B O X BOX BOX里的小球个数不小于 k k k。 n , m , k < = 15 n,m,k<=15 n,m,k<=15。
- f [ i ] [ j ] f[i][j] f[i][j]表示前i个盒子放了j个球的方案数
f [ i ] [ j ] = ∑ l = k j f [ i − 1 ] [ j − l ] ⋅ C n − ( j − l ) l f[i][j]=\sum_{l=k}^{j}f[i-1][j-l]\cdot C_{n-(j-l)}^{l} f[i][j]=l=k∑jf[i−1][j−l]⋅Cn−(j−l)l
完结撒花