组合数学入门—TwelveFold Way

你需要解决\(12\)个组合计数问题。

\(n\)个有标号/无标号的球分给\(m\)个有标号/无标号的盒子

盒子有三种限制:

A、无限制

B、每个盒子至少有一个球

C、每个盒子至多有一个球

共有\(2\times2\times3=12\)种问题:

为了方便 将有标号记为L(labelled) 无标号记为U(unlabelled)

那么一个问题可以用缩写代替,如ULA表示\(n\)个无标号的球分给\(m\)个有标号的盒子,一共有多少种方案。

现在你的任务是,给定问题的缩写和\(n,m\),求方案数对\(998244353\)取模后的值。

LLA

这个很明显答案是\(m^n\),每一个球有\(m\)种选择

LLB

发现这个条件不好满足,考虑容斥,每次强制枚举\(i\)个盒子里面没有球
\[
ans = \sum_{i = 0}^m\binom{n}{i}(m - i)^n
\]

LLC

我们发现,因为要求球全部放入盒子,所以当\(n > m\)肯定无解

否则答案就是
\[
\binom{m}{n}\times n!
\]
看看那几个盒子里面有球,并且因为球是不同的,所以要再乘上排列数

LUB

发现LUB和LLB的区别就是其实就是\(\{1,2,3\},\{4,5\}\)和\(\{4,5\}\),\(\{1,2,3\}\)看做一种

那么我们直接把LLB的答案除以\(m!\)即可

这就引出了我们要介绍的东西,第二类斯特林数

第二类斯特林数,记为\(S\),\(S_n^m\)表示把\(n\)个有标号的球放到\(m\)个无标号的盒子里面的方案数

我们可以比较简单的理解第二类斯特林数的递推公式
\[
S_{n}^m = S_{n - 1}^{m - 1}+ m\times S_{n - 1}^m
\]
每次新开一个盒子放\(i\)或者是放入之前的任何一个集合之中

LUA

我们既然知道了LLB的答案,直接枚举多少个盒子放了球
\[
ans = \sum_{i = 1}^mS_{n}^i
\]
到此为止我们可以发现一个奇妙的性质A和B是知一推一的,有无标号仅仅通过乘组合数推出来

LUC

这就是比较水的了,直接判断能否放下,放得下就是\(1\)

ULB

经典插板法的模型,ULB也可以在做是这样一个方程的正整数解的个数
\[
x_1+x_2+x_3+\dots +x_m = n
\]
那么我们看做这样\(n\)的球插入\(m - 1\)的版子.分割成\(m\)部分的方案数

所以方案数就是
\[
\binom{n - 1}{m - 1}
\]

ULA

我们继续上面的方程

设\(y_i = x_i+ 1\)

也就是我们现在要解决这个方程的正整数解的个数
\[
y_1+y_2+\dots+y_m = n+m
\]
同理,可以知道是
\[
\binom{n + m - 1}{m - 1}
\]
每一组\(y\)都对应着唯一一组\(x\)(因为\(x\)和\(y\)的关系是确定的)

ULC

首先,\(n > m\)肯定无解,接下来只需要考虑\(n\le m\)

否则答案就是\(\binom{m}{n}\)

UUC

同LUC

UUB

这个不能通过ULB除以\(m!\)得到

因为ULB中我们尽管盒子不同,但是球是相同的,所以我们会把\(\{2,3,3\}\)和\(\{2,3,3\}\)看做同一种方案,所以直接除以\(m!\)的前提是上面的例子被看做不同方案,否则就没有排列一说

那我们设\(P_{i,j}\)表示\(i\)个无标号的球分到\(j\)个有标号的盒子里的方案数

为了保证不会重复计数,我们强制盒子的球数目不增

转移要么把新球新开一个盒子,要么在前面所有盒子都放一个球
\[
P_{i.j} = P_{i - 1,j - 1} + P_{i - j,j}
\]
转移边界有\(P_{0,0} = 1\)

这其实就是划分数

UUA

首先,我们可以采用老套路,暴力枚举有多少个盒子中放球
\[
ans = \sum_{i = 1}^m P_n^i
\]
另外类似于ULA的思路,我们发现答案其实是\(P_{n + m}^m\)

组合数学入门—TwelveFold Way的更多相关文章

  1. [BZOJ2111]:[ZJOI2010]Perm 排列计数(组合数学)

    题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\fr ...

  2. [BZOJ2729]:[HNOI2012]排队(组合数学)

    题目传送门 题目描述 某中学有n名男同学,m名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) ...

  3. P5689 多叉堆

    写在前面 OI 生涯中 AC 的首道组合数学应用题. 开题 5min 发现规律,写了半下午代码,调了两天,然而甚至没过样例,心态崩了.几天之后重新写了一份代码才 AC. 虽然思维难度不大,但毕竟是联赛 ...

  4. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  5. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  6. ACM入门步骤(一)

    一般的入门顺序: 0. C语言的基本语法(或者直接开C++也行,当一个java选手可能会更受欢迎,并且以后工作好找,但是难度有点大),[参考书籍:刘汝佳的<算法竞赛入门经典>,C++入门可 ...

  7. ACM基础算法入门及题目列表

    对于刚进入大学的计算机类同学来说,算法与程序设计竞赛算是不错的选择,因为我们每天都在解决问题,锻炼着解决问题的能力. 这里以TZOJ题目为例,如果为其他平台题目我会标注出来,同时我的主页也欢迎大家去访 ...

  8. ACM入门指南

    本文已经转移到了:http://harryguo.me/2015/11/03/ACM-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/ 什么是ACM? 想必打开这篇博客的人已 ...

  9. 数位dp总结 之 从入门到模板

    转发自WUST_WenHao巨巨的博客 基础篇 数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp咯.数位还算是比较好听 ...

随机推荐

  1. 【JZOJ3211】【SDOI2013】随机数生成器

    ╰( ̄▽ ̄)╭ 小 W喜欢读 书,尤其喜欢读 书,尤其喜欢读<约翰克里斯 朵夫>. 最近小 W准备读一本新书,这本一共有 p页, 页码范围为 0..p -1. 小 W很忙,所以每天只能读一 ...

  2. 使用curl指令实现restful接口操作

    curl 是很方便的Rest客戶端,可以很方便的完成許多Rest API測試的需求,甚至,如果是需要先登入或認證的rest api,也可以進行測試,利用curl指令,可以送出HTTP GET, POS ...

  3. nginx简单使用

    nginx开启./nginx重启./nginx -s reload关闭./nginx -s stop或quit

  4. Android实现圆角边框

    http://www.cnblogs.com/flyme/archive/2012/06/20/2556259.html android shape的使用 http://www.cnblogs.com ...

  5. XML内部DTD约束 Day24

    <?xml version="1.0" encoding="UTF-8"?> <!-- 内部DTD --> <!-- XML:ex ...

  6. python 列表索引

  7. 2019-8-31-dotnet-通过-WMI-拿到显卡信息

    title author date CreateTime categories dotnet 通过 WMI 拿到显卡信息 lindexi 2019-08-31 16:55:58 +0800 2019- ...

  8. Python语言的特点

  9. @codeforces - 1205E@ Expected Value Again

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @solution@ @details@ @description@ 给定两个 ...

  10. Python 基础09 面向对象的进一步拓展

    调用类的其他信息 上一讲中提到,在定义方法时,必须有self这一个参数,这个参数表示某个对象,对象有有类的所有性质, 那么我么可以通过self 调用类属性. class Human(object): ...