小球与盒子
- 计数类问题有时候会涉及到小球与盒子的经典模型,因此有了本文。
- 球相同/不同,盒子相同/不同,能/不能有空盒分成了多种不同问题。
前置科技
-
组合数:从n个物品(带编号)里选出m个物品的方案数:
C n m = n ! m ! ( n − m ) ! C_n^m=\frac{n!}{m!(n-m)!} Cnm=m!(n−m)!n!
-
排列数:从n个物品(带编号)里选出m个物品进行排列的方案数:
A n m = n ! ( n − m ) ! A_n^m=\frac{n!}{(n-m)!} Anm=(n−m)!n!
-
圆排列:一个n个元素构成的集合,从中选m个元素构成一个环的方案数:
Q n m = A n m m Q_n^m=\frac{A_n^m}{m} Qnm=mAnm(每个排列被重复计算m次)
-
第一类斯特林数:用n个元素组成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)*s_{n-1}^{m} snm=sn−1m−1+(n−1)∗sn−1m
-
第二类斯特林数:把大小为n的集合划分为m个非空集合的方案数:
S n m = S n − 1 m − 1 + m ∗ S n − 1 m S_n^m=S_{n-1}^{m-1}+m*S_{n-1}^{m} Snm=Sn−1m−1+m∗Sn−1m
-
关于第一类、第二类斯特林数公式的证明,考虑递推证明。
1.球相同,盒子不同,不能有空盒
-
把n个小球分为了m份,考虑其实是在n-1个空隙中插m-1个板。
a n s = C n − 1 m − 1 ans=C_{n-1}^{m-1} ans=Cn−1m−1
2.球相同,盒子不同,可以有空盒
-
强制给每个盒子放入一个小球,此时问题转化为问题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]任意一个盒子里,并且小球不同,所以互不影响。
a n s = m n ans=m^n ans=mn
4.球不同,盒子不同,不可以有空盒
-
考虑容斥。至少好求,恰好不好求,我们用二项式反演。 f [ i ] f[i] f[i]表示至少有 i i i个盒子为空盒的方案数, a n s [ i ] ans[i] ans[i]为恰好有 i i i个盒子为空盒的方案数:
f [ i ] = C m i ( m − i ) n , f [ i ] = ∑ k = i n C k i a n s [ k ] f[i]=C_m^i(m-i)^n,f[i]=\sum_{k=i}^{n}C_{k}^{i}ans[k] f[i]=Cmi(m−i)n,f[i]=k=i∑nCkians[k]
a n s [ i ] = ∑ k = i n ( − 1 ) k − i C k i f [ k ] ans[i]=\sum_{k=i}^{n}(-1)^{k-i}C_{k}^{i}f[k] ans[i]=k=i∑n(−1)k−iCkif[k]
a n s = a n s [ 0 ] = ∑ k = 0 n ( − 1 ) k C k i f [ k ] = ∑ k = 0 n ( − 1 ) k f [ k ] ans=ans[0]=\sum_{k=0}^{n}(-1)^kC_k^if[k]=\sum_{k=0}^{n}(-1)^kf[k] ans=ans[0]=k=0∑n(−1)kCkif[k]=k=0∑n(−1)kf[k]
5.球不同,盒子相同,不能有空盒
-
相当于把大小为n的集合分成m个非空集合的方案数,其实就是第二类斯特林数:
a n s = S n m = S n − 1 m − 1 + m ∗ S n − 1 m ans=S_n^m=S_{n-1}^{m-1}+m*S_{n-1}^{m} ans=Snm=Sn−1m−1+m∗Sn−1m
-
不过这样递推是 O ( n 2 ) O(n^2) O(n2)的。
-
其实就是第四个问题,但是盒子相同,除掉一个排列就好啦。 a n s = a n s 4 m ! ans=\frac{ans_4}{m!} ans=m!ans4
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数。
-
Bell数的定义:第n个Bell数表示集合[1,2,……,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个求放到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.球相同,盒子相同,不能有空盒
-
减去m个球之后,就变成了问题7:
a n s = f [ n − m ] [ m ] ans=f[n-m][m] ans=f[n−m][m]
你以为结束了?不好意思,好戏刚开始。
盒子与小球二
-
N个有差别的盒子(1<=N<=20)。你有A个红球和B个蓝球。0<=A<=15,0<=B<=15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
-
A的放置和B的放置互不影响,我们可以单独统计再相乘。
-
枚举一个i,问题转化成把i个相同小球放到n个不同盒子里,可以有空盒的方案数:
a n s A = 1 + ∑ i = 1 A C i + n − 1 n − 1 = C A + n n ansA=1+\sum_{i=1}^{A}C_{i+n-1}^{n-1}=C_{A+n}^{n} ansA=1+i=1∑ACi+n−1n−1=CA+nn
-
ansB同理。
a n s = a n s A ∗ a n s B = C i + A n C i + B n ans=ansA*ansB=C_{i+A}^{n}C_{i+B}^{n} ans=ansA∗ansB=Ci+AnCi+Bn
盒子与小球三
-
有n个相同的球,m个不同的盒子,每个盒子最多放t个球,请计算将这n个小球全部放入盒子中(可以有空盒)的方案数模1e6+7后的结果,n<=5e3,m<=5e3。
-
对限制进行容斥,恰好不好求,至少好求。
-
f [ i ] f[i] f[i]表示至少有i个盒子放的小球大于t个的方案数
-
a n s [ i ] ans[i] ans[i]表示恰好有i个盒子放的小球大于t个的方案数
f [ i ] = ∑ k = i m C k i a n s [ k ] f[i]=\sum_{k=i}^{m}C_{k}^{i}ans[k] f[i]=k=i∑mCkians[k]
反演得: a n s [ i ] = ∑ k = i m ( − 1 ) k − i C k i f [ k ] ans[i]=\sum_{k=i}^{m}(-1)^{k-i}C_{k}^if[k] ans[i]=k=i∑m(−1)k−iCkif[k]
f [ i ] = C m i C n − i ( t + 1 ) + m − 1 m − 1 f[i]=C_m^iC_{n-i(t+1)+m-1}^{m-1} f[i]=CmiCn−i(t+1)+m−1m−1
-
答案即为ans[0]:
a n s [ 0 ] = ∑ i = 0 m ( − 1 ) i f [ i ] ans[0]=\sum_{i=0}^m(-1)^if[i] ans[0]=i=0∑m(−1)if[i]
盒子与小球四
-
给定n个不同的小球,和m个不同的盒子,有多少种不同的放球方法,使得每个盒子里的小球数量不少于k。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}^jf[i-1][j-l]*C_{n-(j-l)}^l f[i][j]=∑l=kjf[i−1][j−l]∗Cn−(j−l)l
终于完了,新成就达成(#.#)。汤神天上第一!