当小球遇上盒子

小球与盒子问题

  • 这类问题是求解把一些小球放进一些盒子里的本质不同的方案数。
  • 通过球相同/不同,盒子相同/不同,能/不能有空盒分成了8个不同的问题。
  • 本篇文章会分别对这8个问题进行分析求解。

前置芝士&复习巩固

  • 组合数 :从 n n n个物品里选出m个物品进行组合的方案数。
    C n m = n ! m ! ⋅ ( n − m ) ! C_{n}^{m}=\frac{n!}{m!\cdot (n-m)!} Cnm=m!(nm)!n!

  • 排列数 :从 n n n个物品里选出 m m m个物品进行排列的方案数。
    A n m = n ! ( n − m ) ! A_{n}^{m}=\frac{n!}{(n-m)!} Anm=(nm)!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=sn1m1+(n1)sn1m

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

1.球相同,盒子不同,不能有空盒

  • 就是把 n n n个球分成 m m m份,每一份不能为空,插 m − 1 m-1 m1个板即可。
    a n s = C n − 1 m − 1 ans=C_{n-1}^{m-1} ans=Cn1m1

2.球相同,盒子不同,可以有空盒

  • 把n个球分成 m m m份,每一份可以为空,再增加 m m m个球,插 m − 1 m-1 m1个板,每一份再拿走一个球即可。
    a n s = C n + m − 1 m − 1 ans=C_{n+m-1}^{m-1} ans=Cn+m1m1

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]=(mi)nCmi
    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=imCjians[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=im(1)j+iCjif[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=0m(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=0mS[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=0nS[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==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.球相同,盒子相同,不能有空盒

  • 我们首先在所有的盒子中放一个球,就转化成了问题7
    a n s = f [ n − m ] [ m ] ans=f[n-m][m] ans=f[nm][m]

以上就是盒子小球最基础的八种情况了

盒子与小球二

  • N N N个有差别的盒子 ( 1 &lt; = N &lt; = 20 ) (1&lt;=N&lt;=20) (1<=N<=20)。你有 A A A个红球和 B B B个蓝球。 0 &lt; = A &lt; = 15 , 0 &lt; = B &lt; = 15 0 &lt;= A &lt;= 15, 0 &lt;= B &lt;= 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=1Aj=1min(i,n)CnjCi1j1
    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=1Bj=1min(i,n)CnjCi1j1
    a n s = a n s A ⋅ a n s B ans=ansA\cdot ansB ans=ansAansB

盒子与小球三

  • n n n个相同的球, m m m个不同的盒子,每个盒子最多放 k k k个球 ,请计算将这 n n n个球全部放入盒子中的方案数模 1000007 1000007 1000007后的结果 , n &lt; = 5000 n&lt;=5000 n<=5000 m &lt; = 5000 m&lt;=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]=CmiCni(k+1)+m1m1
  • 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=im(1)j+if[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=0m(1)iCmiCni(k+1)+m1m1

盒子与小球四

  • 给定 n n n个各不相同的小球,和 m m m个不同的 B O X BOX BOX,有多少种不同的放球方法,使得每个 B O X BOX BOX里的小球个数不小于 k k k n , m , k &lt; = 15 n,m,k&lt;=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=kjf[i1][jl]Cn(jl)l

完结撒花

    原文作者:ShɑΙteж
    原文地址: https://blog.csdn.net/strangeDDDF/article/details/88319108
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞