←返回主页

组合数

先来说一说组合数的概念

个物品中选 个物品,共有多少种方案

二项式系数

感性理解:

img

杨辉三角 & 递推求组合数

将其列成一个表:

img

于是我们可以递推求出

*这里要注意边界情况(

时间复杂度:

代码

下面是一些十分有趣的性质

一些性质

这个直观来看就是杨辉三角第 行的和

注意到每个 都被计算了两次

直接根据杨辉三角感性理解 /cy

快速求组合数

可以保证每一步运算都是整数

可以单次 计算组合数模任意数

记录组合数因子出现次数 , 若知道每个数x的最小质因子

从后往前扫 对于每个合数 将

最后可以得到质因数分解形式 由于质数个数 最终复杂度


对于质数 可以 预处理 求值

如果n太大了怎么办?

可以直接 Lucas定理 (注意模数必须是质数)

如果模数也很大怎么办?

比如

分块打表

为了快速获得

设置 打表 , ,

每次查询一个 只需要用表中最接近的值

计算表的长度

如果模数不是定值怎么办?

不会(


例题

一个正 边形 将其所有对角线连起来 一共有多少个交点

保证 是奇数 不存在三条对角线共点

对于任意的四个点,可以确定两条对角线,有一个交点

所有答案

例题

给定 , 两个数组, 求

考虑 的组合意义

走到 的方案数

考虑 的组合意义

走到 的方案数

走到 的方案数

考虑计算任意 到任意 的方案数

减去重复计算的就好了

dp 可以做到

例题

给你一棵 个节点的有根树。你要给每个节点分配一个 的数字,使得每个节点分配的数字不同,并且每个节点分配的数字都是它子树内最小的。求方案数

考虑树形dp

表示 这个子树分配 的方案数

考虑状态转移

进一步推导:

基础组合问题

加法原理

要么 要么 (A和B不相交)

一个整数可以属于 那么共有 种可能

乘法原理

中各选一个

第一个整数属于 第二个整数属于 共有 种可能

栗子:

求有 个点的二分图最多有多少条边?

显然一边 个点, 另一边 个点

左边的每一个点可以于右面的 个点相连

栗子 2:

个未知数,给定每个数的上限 ,问你有多少种方法使得这些未知数都是正整数且互不相同。输出方案数模

考虑将 从小到大排序 依次确定未知数的值

一个很有用的计数原则

一个由计数对象组成的集合 ,要计算它的大小 ,考虑如果我们找到一个集合 ,使得 的元素与 的元素一一对应,那么

一个推广

如果 的每个元素对应到 中的元素, 的每个元素对应到 中的元素,那么有


接下来我们就要讲讲最重要的

Twelvefold way

个有标号/无标号的球分给 个有标号/无标号的盒子

盒子有三种限制: A. 无限制 B. 每个盒子至少有一个球 C. 每个盒子至多有一个球

种问题

为了方便 将有标号记为 无标号记为

那么一个问题可以用缩写代替 如 UUA

(LLA) 个有标号的球分给 个有标号的盒子

(ULA) 个无标号的球分给 个有标号的盒子

等同于方程的整数解个数

(ULB) 个无标号的球划分给 个有标号的盒子 不能有空盒

等同于方程的整数解个数

(LLC) 个有标号的球分给 个有标号的盒子 每个盒子至多放一个球

(ULC) 个无标号的球分给 个有标号的盒子 每个盒子至多放一个球

(LUC) 个有标号的球分给 个无标号的盒子 每个盒子至多放一个球

(UUC) 个无标号的球分给 个无标号的盒子 每个盒子至多放一个球

中间插播一下容斥 (

(LLB) 个有标号的球划分给 个有标号的盒子 不能有空盒 使用容斥原理:

(LUB) 个有标号的球划分给 个无标号的盒子 不能有空盒

(LLB) 的答案再除以m!

(LUB) 即 个有标号的球划分给 个无标号的盒子 不能有空盒

第二类斯特林数.

(LLB) 即 个有标号的球划分给 个有标号的盒子 不能有空盒

(LUA) 个有标号的球划分给 个无标号的盒子

枚举有几个盒子被分配了

插播 : 划分数

划分数

划分为 个正整数的方案数 方案与 的顺序无关

递推式

考虑最小的数是否为

那么剩下的 UUAUUB 就很好解决了

(UUB) 个无标号的球划分给 个无标号的盒子 每个盒子至少有一个球

(UUA) 个无标号的球划分给 个无标号的盒子

枚举有几个盒子被分配了

ABC三种限制的意义

A)无限制 (labelling)

将每个元素标号 放进第i个盒子就标为i号(当盒子有标号时 无标号时和B类似)

B)每个盒子至少有一个球 (grouping)

将所有元素分成m组 放进同一个盒子的是同一组

C)每个盒子至多有一个球 (selection)

为每个球选一个盒子