先来说一说组合数的概念
从 个物品中选 个物品,共有多少种方案
感性理解:
将其列成一个表:
于是我们可以递推求出
*这里要注意边界情况(
时间复杂度:
xxxxxxxxxx
81for i = 0 to n :
2 C[i][0] = 1;
3for i = 1 to n :
4 C[i][i] = 1;
5
6for i = 1 to n :
7 for j = 1 to i :
8 C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]);
下面是一些十分有趣的性质
这个直观来看就是杨辉三角第 行的和
令
注意到每个 都被计算了两次
直接根据杨辉三角感性理解 /cy
可以保证每一步运算都是整数
可以单次 计算组合数模任意数
记录组合数因子出现次数 , 若知道每个数x的最小质因子
从后往前扫 对于每个合数 将
最后可以得到质因数分解形式 由于质数个数 最终复杂度
对于质数 可以 预处理 求值
如果n太大了怎么办?
可以直接 Lucas定理
(注意模数必须是质数)
如果模数也很大怎么办?
比如
分块打表
为了快速获得
设置 打表 , , …
每次查询一个 只需要用表中最接近的值
计算表的长度
如果模数不是定值怎么办?
不会(
例题
一个正 边形 将其所有对角线连起来 一共有多少个交点
保证 是奇数 不存在三条对角线共点
对于任意的四个点,可以确定两条对角线,有一个交点
所有答案
例题
给定 , 两个数组, 求
考虑 的组合意义
从 走到 的方案数
考虑 的组合意义
从 走到 的方案数
从 走到 的方案数
考虑计算任意 到任意 的方案数
减去重复计算的就好了
用 dp
可以做到
例题
给你一棵 个节点的有根树。你要给每个节点分配一个 的数字,使得每个节点分配的数字不同,并且每个节点分配的数字都是它子树内最小的。求方案数
考虑树形dp
表示 这个子树分配 的方案数
考虑状态转移
进一步推导:
要么 要么 (A和B不相交)
一个整数可以属于 或 那么共有 种可能
和 中各选一个
第一个整数属于 第二个整数属于 共有 种可能
栗子:
求有 个点的二分图最多有多少条边?
显然一边 个点, 另一边 个点
左边的每一个点可以于右面的 个点相连
故
栗子 2:
个未知数,给定每个数的上限 ,问你有多少种方法使得这些未知数都是正整数且互不相同。输出方案数模
考虑将 从小到大排序 依次确定未知数的值
一个很有用的计数原则
一个由计数对象组成的集合 ,要计算它的大小 ,考虑如果我们找到一个集合 ,使得 的元素与 的元素一一对应,那么
一个推广
如果 的每个元素对应到 个 中的元素, 的每个元素对应到 个 中的元素,那么有
接下来我们就要讲讲最重要的
个有标号/无标号的球分给 个有标号/无标号的盒子
盒子有三种限制: A. 无限制 B. 每个盒子至少有一个球 C. 每个盒子至多有一个球
共 种问题
为了方便 将有标号记为 无标号记为
那么一个问题可以用缩写代替 如 UUA
(LLA
) 个有标号的球分给 个有标号的盒子
(ULA
) 个无标号的球分给 个有标号的盒子
等同于方程的整数解个数
(ULB
) 个无标号的球划分给 个有标号的盒子 不能有空盒
等同于方程的整数解个数
(LLC
) 个有标号的球分给 个有标号的盒子 每个盒子至多放一个球
(ULC
) 个无标号的球分给 个有标号的盒子 每个盒子至多放一个球
(LUC
) 个有标号的球分给 个无标号的盒子 每个盒子至多放一个球
(UUC
) 个无标号的球分给 个无标号的盒子 每个盒子至多放一个球
中间插播一下容斥 (
(LLB
) 个有标号的球划分给 个有标号的盒子 不能有空盒
使用容斥原理:
(LUB
) 个有标号的球划分给 个无标号的盒子 不能有空盒
(LLB
) 的答案再除以m!
(LUB
) 即 个有标号的球划分给 个无标号的盒子 不能有空盒
第二类斯特林数.
(LLB
) 即 个有标号的球划分给 个有标号的盒子 不能有空盒
(LUA
) 个有标号的球划分给 个无标号的盒子
枚举有几个盒子被分配了
插播 : 划分数
划分数
将 划分为 个正整数的方案数 方案与 的顺序无关
xxxxxxxxxx
514 = 1 + 1 + 1 + 1
2= 2 + 1 + 1
3= 2 + 2
4= 3 + 1
5= 4
递推式
考虑最小的数是否为
那么剩下的 UUA
和 UUB
就很好解决了
(UUB
) 个无标号的球划分给 个无标号的盒子 每个盒子至少有一个球
(UUA
) 个无标号的球划分给 个无标号的盒子
枚举有几个盒子被分配了
ABC三种限制的意义
A)无限制 (labelling
)
将每个元素标号 放进第i个盒子就标为i号(当盒子有标号时 无标号时和B类似)
B)每个盒子至少有一个球 (grouping
)
将所有元素分成m组 放进同一个盒子的是同一组
C)每个盒子至多有一个球 (selection
)
为每个球选一个盒子