- yeyou26 的博客
浅谈计数类问题
- 2025-7-2 17:27:15 @
关于“浅谈”
- 真的很浅,不是 NOI WC 的那种《浅谈》
- 难度(应该)不超过蓝题,没有重工业/高科技
基础原理
计数原理
- 加法原理:如果做一件事情有两类方式,第一类方式有 种方法,第二类方式有 种方法,那么做这件事情总共有 种方法。
- 乘法原理:如果做一件事情分为两步,第一步有 种方法,第二步有 种方法,那么做这件事情总共有 种方法。
恭喜你,现在,你已经掌握了计数的基本原理了,就让我们看一看下面这个简单的例子,来把我们刚刚学到的东西运用到实践中吧!
- P5291 【省选联考2019】希望
二项式定理
Lucas 定理
- $C_{n}^m\equiv C_{n\%p}^{m\%p}C_{n/ p}^{m/p}~(m od ~p)$
需要背过的组合数恒等式
- 不合法
- 选 个等效于不选另外 个
- 分子分母分别补上对应系数
- 帕斯卡定理
- 考虑选不选最后一个
- 个元素的所有子集
- 组合数的和
- 二项式定理
- 二项式定理
- 组合数加权和
- 利用第二条恒等式推出
- 范德蒙德卷积
- 每一种选法都与两个集合合并后的一种选法一一对应
- 范德蒙德卷积 的特殊情况
- 范德蒙德恒等式
- 个元素选 个,枚举最后一个元素选什么
- $\sum_{i=0}^n C_i^m=\sum_{i=m}^n C_i^{m}=C_m^m+C_{m+1}^m+\cdots+C_n^m$ $=C_{m+1}^{m+1}+C_{m+1}^{m}+\cdots+C_n^m=C_{m+2}^{m+1}+C_{m+2}^m+\cdots+C_n^m=C_{n+1}^{m+1}$
- $\sum_{i=s}^n C_i^m=\sum_{i=0}^n C_i^m-\sum_{i=0}^{s-1} C_i^m=C_{n+1}^{m+1}-C_{s}^{m+1}$
- 范德蒙德恒等式引理
插板法
是一种思想,应用较广,用两个例题来理解
- 问题 1:有 个完全相同的元素,要求将其分为 组(组间有序),每组至少有一个元素,一共有多少种分法?
- 转化问题, 个元素分成 组,可以视作将 个元素排成 一列,然后在其中的 个间隔中选择 个间隔插入隔板,答案为
- 也可以看作整数拆分方案数,即把 拆分成不为 0 的 个数的方案数
- 问题 2:有 个完全相同的元素,要求将其分为 组(组间有序),每组可以为空,一共有多少种分法?
- 考虑每组“借”一个元素进来,就变成了 个元素分成 组,每组至少有一个元素的情况,原问题和新问题的解一一对应,答案相同,根据问题 1 得答案为
- 同样可以看作把 拆分为可以为 0 的 个数的方案数
常见定理及引理
圆排列
多重集上的排列组合
- 多重集上的排列常见,多重集上的组合不常见且难度过大,这里只讲多重集上的排列
- 是指将多重集 的元素任意排列得到的不同有序序列个数,实际就是有重复元素的排列数(无重复元素就是 )
- 也就是:
- 例题:把有标号五个人分配到有标号三个村子,其中一个村子分配一个人,两个村子分配两个人,问有多少种分法?(禁止使用斯特林数)
- 第一步:利用多重集排列去除村子的标号,即求 三个数有几种本质不同的排列,得到因子
- 第二步:五个人里选两个去第一个村庄,剩下的三个人里再选两个去第二个村庄,剩下的一个人里再选一个去第三个村庄,得到因子
- 乘法原理得到答案
错排列
- 错位排列:对于一个长度为 的有序排列 ,如果满足 ,则称 是 的错位排列,即每个元素都不能在其原来位置的排列
- 考虑错排的计算公式,设 为长度为 的错位排列个数, 考虑在长度为 的错排列基础上再加一个数
- 如果第 个数与前 个数中的某一个恰好互换来了位置,有两个数被定住,剩下的数显然是一种错排,方案数为
- 否则,钦定 这个数放在前 个位置中的某个地方,前 个数中除了那个被占位置的数不能根 交换位置的数(这样就变成第一种情况了)剩下的数都只需要保证不在原来的位置,所以这又是一个错排,方案数为
- 综上,
斯特林数
基本不考,但是早晚会有用
- 第一类斯特林数:
- 排列有 个环
- 第二类斯特林数:
- 个不同球放到 个相同盒子且盒子非空的方案数
鸽巢原理
- 对于一般形式,若将 个物体,划分为 组,那么至少存在一个分组,含有大于或等于 个物品
- 人话:往五个抽屉里放六只 FDsama,那么至少有一个抽屉里有两个 FDsama
- 没啥用,了解就行,
不了解也行
卡特兰数
- 到底什么是卡特兰数?
- 卡特兰数是一种特殊数列,是若干解有关于系数 的计数问题的的答案序列
- 有 个人排成一行进入剧场。入场费 5 元。其中只有 个人有一张 5 元钞票,另外 人只有 10 元钞票,剧院无其它钞票。 问有多少种方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?
- 方格图左下角为 右上角为 ,从左下角开始每次都只能向右或者向上走一单位,不走到对角线 上方的情况下到达右上角有多少可能的路径?
- 一个栈的进栈序列为 ,有多少个不同的出栈序列?
- ...
- 以上所有问题,答案序列都是:
- 如果打表发现形如这样的序列,可考虑卡特兰数
- 卡特兰数的公式有一车,但通常只记这一个就够用了:
- 考虑用第二个实例的实际意义推出这个公式:
- 有一个大小为 的方格图左下角为 右上角为 ,从左下角开始每次都只能向右或者向上走一单位, 不走到对角线 上方(但可以触碰)的情况下到达右上角有多少可能的路径
- 不考虑限制的总方案数: (总步数为 ,其中向上的个数为 )
- 将对角线向上平移一格,显然碰到平移后的线与违法是充要的
- 将目标点 沿平移后的直线翻折到 ,发现走到 的方案对称后与违法方案一一对应,所以违法方案数为
- 故合法方案数为
容斥原理
- 臭名昭著的问题:
- 信竞队有 名同学,其中有 个人说批话,有 个人是 fake 侠,有 个人是 FDsama,有 个人既说批话又是 fake 侠,有 个人既说批话又是 ,有 个人既是 fake 侠又是 FDsama,有 个人既说批话,又是 fake 侠,又是 FDsama,问 的值。
- 简单来说,就是对 种非空的交集求和,系数为
- 形式化地写
- $|S_1 \cup S_2 ∪ \cdots ∪ S_n|=\sum|S_i|-\sum|S_i\cap S_j|+\cdots+(-1)^{n-1}|S_1\cap S_2\cap \cdots \cap S_n|$ -$|A_1 \cup A_2 \cup \cdots \cup A_n| = \sum_{i=1}^{n} (-1)^{i-1} \sum |A_{p_{i,1}} \cap A_{p_{i,2}} \cap \cdots \cap A_{p_{i,i}}|$
$$\begin{aligned} Cnt=&|\{T_i\}|-|\{T_i\cap T_j|i<j\}|+\cdots+(-1)^{k-1}\left|\left\{\bigcap_{i=1}^{k}T_{a_i}|a_i<a_{i+1}\right\}\right|\\ &+\cdots+(-1)^{m-1}|\{T_1\cap\cdots\cap T_m\}|\\ =&\dbinom{m}{1}-\dbinom{m}{2}+\cdots+(-1)^{m-1}\dbinom{m}{m}\\ =&\dbinom{m}{0}-\sum_{i=0}^m(-1)^i\dbinom{m}{i}\\ =&1-(1-1)^m\\ =&[m=0] \end{aligned}$$
- 证明: 是某个元素被统计进入答案的总次数, 是包含这个元素的集合个数,则:
二项式反演
$$f(i)=\sum_{k=i}^{n}C_{i}^k\times g(k) \leftrightarrow g(i)=\sum _{k=i}^{n}C_{i}^k\times (-1)^{k-i}\times f(k) $$
- 设 为至少满足 个条件的方案数, 为恰好满足 个条件的方案数
正确显然证明不难留作作业答案略- 证明过于麻烦,如有兴趣可自行学习
杂题选讲
怎么做题
- 交换求和号
- 合理作差(作商)
- 前缀和/前缀积
- 过于简单 不再赘述
- 记忆组合恒等式
- 挖掘题目性质
- __ __ 多 练
NOIP T2
题面
- 个变量 。每个变量可以取 至 的整数取值。
- 条二元限制,其中第 ()条限制为:
- 若 ,则要求 ,且 与 为 到 之间的整数;
- 当 时,第 条限制对 的值不做任何约束。
- 条一元限制,其中第 ()条限制为:。
- 一元限制给定,要求构造二元限制,求有解的构造方案数。
- ,,
WZH 命题模拟赛 T2
题面
有一棵树,每个点有 个人。 现在需要设计一个集合点,使所有人都到达该点。 因为会越走越累,所以一个人从点 集合至点 需要花费 的代价。 对于每一个点,求如果选择该点作为集合点,代价的总和。
CF1536F (div2+div2 F)
题面(略去博弈论部分)
- 圆上 个点,每个点最初都空着,开始往圆上放字母(A 或 B)
- 放完之后,相同字母不可相邻,空格不可相邻,A 的数量等于 B 的数量,放到不能再放
- 问不同的放置过程数
ABC266G
题面
求符合要求的字符串个数。 满足要求的字符串 具备以下特性:
- 由
r
、g
、b
构成。
- 中有 个
r
, 个g
, 个b
, 个rg
。
sol
- 朴素做法
- 求出至少有 个
rg
的方案数,这个简单插板即可- 二项式反演即可
- clever 做法
- 我们把
rg
看成新的字符,问题转化为:给定四种字符数量,其中两种不能在一起,求方案数,简单插板即可
FD 说批话
题面
- FD 有 句批话,它们的长度为
- FD 今天要从中选取一些批话来说
- 如果选取的批话中有三句的长度可以构成三角形,则这组批话是有攻击性的
- 一组批话的攻击力定义为:
- 如果这组批话有攻击性,则攻击性是其中最长的批话的长度 这组批话的个数
- 否则,这组批话的攻击力为
- 求在所有可能中,FD 选取的批话的攻击力之和。
- ,。
sol
- 容斥,用所有方案的贡献减去没有攻击力的方案的贡献
- 注意到没有攻击性的方案满足
- 考虑 dp 设 分别表示倒数第一个倒数第二个选第 个数 , 不合法方案中的数的个数和,不合法方案数。
- 注意到可以对 产生贡献的状态是一个范围单调的前缀
- $f[i][j]\leftarrow (pre) f[j][k],dp[i][j]\leftarrow (pre)(dp[j][k]+f[j][k])$
- 考虑如何计算所有方案的价值 : 枚举最大值 , 列出一个形如组合数求和的式子 , 简单推一下
CCPC Online 2024 I
题面
- 在机场,有 个人要拿 件行李
- 传送带是长条形状的, 个行李在传送带上的位置分别为 , 个人的位置分别为
- 传送带向坐标轴正方向每秒移动一个单位,即每秒会让所有行李
- 人和行李均从 1 开始编号。显然对于一个人来说,右边的行李都是看过了的,没有自己的行李,自己的行李只可能在其左边,也可能没有。
- 一个人可以至少有零个行李,至多只有一个行李。 一个行李至少属于零个人,至多属于一个人。
- 求在所有情况下,最早有人拿到自己的行李的时刻的和。
- $1 \leq n, m \leq 500,1 \leq a_i \leq 500,1 \leq b_i \leq 500$ 不保证 之间两两互不相等
sol
- 注意到数据范围很小
- 考虑枚举等待时刻
- 发现不好做,考虑改变 的意义为:至少等待 时刻
- 考虑 dp
- 总时间复杂度