• 小球与盒子


    题目描述

    前言

    首先感谢 (wqy)(2018) 年初赛之前出这道题目来帮助我们提高组合数学的能力。 虽然我当时太菜,并没有去做

    前置知识

    组合数和排列数的公式以及原理和简单乘法原理,所以请提前百度。

    要用到的公式:

    [A_n^r=frac{n!}{(n-r)!} ]

    [C_{n}^{m}=frac{n !}{m !(n-m) !} ]

    需要注意的是,排列数与组合数的区别就是选出来的元素是否可以区分。

    思路

    比较简单的都是带 (C) 限制的,所以我们先看带 (C) 限制的。

    LUC和UUC

    观察 (LUC)(UUC) 因为盒子是没有区别的,所以一个球无论放在哪个盒子里都一样,所以只有两种情况, (n>m) 显然是 (0) ,否则就是 (1)

    ULC

    我们发现盒子是有标号的,而球是没有标号的,所以放在所有的球放的盒子不同结果肯定不一样,所以就是相当于给你 (m) 个盒子,让选 (n) 个放球,答案就是 (C_m^n)

    LLC

    我们可以发现现在球也有标号,就相当于再求组合数的时候要求选出来的也是有序的,这就是排列数,所以答案就是 (A_m^n)

    LLA

    再看一种比较简单的情况, (LLA) 的答案直接就是 (m^n) ,就相当于你第一个球有 (m) 种放法,第二个也是如此,一共有 (n) 个球,就是 (n)(m) 相乘,所以答案就是 (m^n)

    还有几种用组合数学可以解决的情况。

    ULB

    盒子是有标号的,而且每一个盒子都要有一个球,所以可以用插板法,就是相当于在 (m) 个球的 (m-1) 个空隙里,加入 (n-1) 个板,分为 (n) 个集合。所以答案就是 (C_{n-1}^{m-1})

    为什么 (ULB) 可以用插板法来解决呢??

    首先,使用插板法,要插板的东西必须是没有区别的,因为插板法只能控制两个板中东西的数量,如果两个板中间的东西有标号的话,显然会算少。

    但是如果选出来的集合再没有标号的话,也是错误的。

    因为 ((1,2))((2,1)) 被当成两种情况去计算了,而如果选出来的集合再没有标号的话,这就是一种情况。

    ULA

    这个看起来和上面的 (ULB) 毫无关联,其实这个是可以转化为 (ULB) 的情况,可以先将每一个盒子都先放上一个球,然后就成了 (ULB) ,答案是 (C_{n+m-1}^{m-1})

    下面的几种情况都是需要用 (DP) 来解决的。

    前三个问题是用第二类斯特林数来解决的。

    第二类斯特林数(简称为 (S_2))的定义为将 (n) 个物体划分成 (k) 个非空的没有区别的集合的方法数,大致就是把 (n) 个不同的小球放入 (m) 个相同的盒子中(且盒子不能为空)的方案数。递推公式为

    (S_2[i][j]=S_2[i-1][j] * j+S_2[i-1][j-1])(S_2[i][j]) 表示将前 (i) 个小球放在前 (j) 个盒子里的方案数)

    第一个转移是在前面的 (j) 个盒子里任意找一个盒子放上这个球,第二个转移是找一个新盒子来放这个球。

    UUB

    根据上面第二类斯特林数的定义,所以 (UUB) 就是 (S_2[n][m])

    ULB

    我们发现 (ULB) 只是将没有去区别的盒子变成了有区别的,所以我们只需要在 (S_2[n][m]) 的基础上乘上 (m!) 就可以了。就是相当于盒子有 (m!) 种放置方法,然后每种都有 (S_2[n][m]) 种可能性。

    ULA

    因为盒子在 (UUB) 的状态下是无序的,所以哪个盒子为空没有区别,我们直接枚举有几个盒子不放就可以了,答案就是

    [sum_{i=1}^{m} S_2[n][i] ]

    UUB

    直接在 (ULB) 的基础上除一个 (m!) 是错误的。

    我们考虑 (DP) ,设 (P[i][j]) 表示将 (i) 个球放在 (j) 个盒子里,所有盒子都不为空的方案数。

    [P[i][j]=P[i-1][j-1]+P[i-j][j] ]

    第一个转移表示新开一个盒子去放当前这个球,第二个表示在每一个盒子里都放上一个球。

    其实这个有一个名字叫划分数,所以答案就是 (P[n][m])

    UUA

    这个也可以和上面 (ULB)(ULA) 一样,在每个盒子里先都先放上一个球,然后答案就是 (P[n+m][m])

  • 相关阅读:
    javascript之数组操作
    python中的类中属性元素加self.和不加self.的区别
    Q查询
    jQuery EasyUI的各历史版本和应用
    了解Entity Framework中事务处理
    C#中Abstract和Virtual的区别
    控制器post参数接收
    存储过程调用存储过程
    表变量、临时表(with as ,create table)
    LINQ TO SQL 实现无限递归查询
  • 原文地址:https://www.cnblogs.com/last-diary/p/11663228.html
Copyright © 2020-2023  润新知