小球与盒子的浪漫之旅

小球与盒子

  • 计数类问题有时候会涉及到小球与盒子的经典模型,因此有了本文。
  • 球相同/不同,盒子相同/不同,能/不能有空盒分成了多种不同问题。

前置科技

  • 组合数:从n个物品(带编号)里选出m个物品的方案数:

    C n m = n ! m ! ( n − m ) ! C_n^m=\frac{n!}{m!(n-m)!} Cnm=m!(nm)!n!

  • 排列数:从n个物品(带编号)里选出m个物品进行排列的方案数:

    A n m = n ! ( n − m ) ! A_n^m=\frac{n!}{(n-m)!} Anm=(nm)!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=sn1m1+(n1)sn1m

  • 第二类斯特林数:把大小为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=Sn1m1+mSn1m

  • 关于第一类、第二类斯特林数公式的证明,考虑递推证明。

1.球相同,盒子不同,不能有空盒
  • 把n个小球分为了m份,考虑其实是在n-1个空隙中插m-1个板。

    a n s = C n − 1 m − 1 ans=C_{n-1}^{m-1} ans=Cn1m1

2.球相同,盒子不同,可以有空盒
  • 强制给每个盒子放入一个小球,此时问题转化为问题1。

    a n s = C n + m − 1 m − 1 ans=C_{n+m-1}^{m-1} ans=Cn+m1m1

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(mi)n,f[i]=k=inCkians[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=in(1)kiCkif[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=0n(1)kCkif[k]=k=0n(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=Sn1m1+mSn1m

  • 不过这样递推是 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=0mS[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=0nS[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==0m==1)   f[n][m]=1

    i f ( n &lt; m )      f [ n ] [ m ] = f [ n ] [ n ] if(n&lt;m)~~~~f[n][m]=f[n][n] if(n<m)    f[n][m]=f[n][n]

    i f ( n &gt; = m )      f [ n ] [ m ] = f [ n − m ] [ m ] + f [ n ] [ m − 1 ] if(n&gt;=m)~~~~f[n][m]=f[n-m][m]+f[n][m-1] if(n>=m)    f[n][m]=f[nm][m]+f[n][m1](至少有一个空盒+没有空盒)

  • 等价于自然数拆分问题。

8.球相同,盒子相同,不能有空盒
  • 减去m个球之后,就变成了问题7:

    a n s = f [ n − m ] [ m ] ans=f[n-m][m] ans=f[nm][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=1ACi+n1n1=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=ansAansB=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=imCkians[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=im(1)kiCkif[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]=CmiCni(t+1)+m1m1

  • 答案即为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=0m(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[i1][jl]Cn(jl)l

终于完了,新成就达成(#.#)。汤神天上第一!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值