20240820:组合计数(2)
组合数#
定义:
通项#
考虑其组合意义:
把所有
二项式定理#
组合意义:从
因此第
组合数的对称性#
组合数的吸收公式#
递推公式#
组合意义就是讨论第
从生成函数的角度理解:
组合数的行和#
组合数的列和#
把和式中第一个非零项
。 。
以此类推得到
范德蒙德卷积#
把
枚举
一个很有用的公式#
等价于
容斥原理#
考虑每个元素在右式被计算几次。
如果一个元素在
因此左边等于右边。
很多情况下要求同时满足
记
无限制的格路计数#
题意:给定
设往右上走了
解方程
如果
从生成函数的角度理解,次数代表纵坐标:
反射容斥#
例1:给定
问不经过直线
考虑用上个模型的方案数减去经过
对于一个经过
则合法方案数等于
例2:给定
问不经过直线
还是用总方案减去不合法的方案,问题转化为经过

对于一条路径,如果经过
把连续相同字符缩成一个,即 "BAB"。
每个路径都可以映射成一个字符串,字符串 “AB” 表示一条先经过
钦定先经过
恰好呢?考虑上述计算方式会多计算哪些情况?
所谓 "AB",我们在计算过程中并不关心 "A" 前面有没有 "B" 以及 "B" 后面有没有 "A", "AB", "ABA"...。
也就是说,"BAB", "BABA"... 和 "ABA", "ABAB"... 都会在计算 "AB" 时被算到。
如何构造容斥系数使得每种非法情况("A", "B", "AB", "BA", "ABA"...)最后计算次数恰好为
从另一个角度考虑重复计算,如果
对于字符串 "ABABA",其本质不同子串有 "A", "AB", "ABA", "ABAB", "ABABA", "B", "BA", "BAB", "BABA"。共
我们知道
由于每增加一个字符,横坐标就要增加至少
卡特兰数#
定义:第
通项#
用反射容斥解释这个式子。
左括号表示
这样映射满足了合法括号序列的充要条件:左括号 = 右括号;任意前缀左括号不小于右括号。
递推式#
枚举第一个右括号之间有多少括号对:
通过递推式解得卡特兰数的生成函数
子集反演#
只考虑第一个式子,第二个类似。
从左推右:
记
带回原式:
从右推左:
二项式反演#
引入#
错排问题:
钦定
定义
问题在于
有组合恒等式
说一句废话:
把
公式#
可以理解为
实际应用中一般用第二种形式,
莫比乌斯反演#
引入#
周期问题:求长度为
定义
显然有
设函数
构造一句废话然后代入:
公式#
从子集反演的角度理解这个公式。
把每个数
整除关系即集合之间的包含关系。
现在目的是从
只容斥与原数高度相差
这同时也与
第二类斯特林数#
通项公式#
先假定
钦定部分集合为空,然后容斥。
递推式#
考虑最后一个元素
选一个现有集合扔进去(虽然集合互不区分,但是元素互不相同);新增一个集合。
普通幂转下降幂#
选出
单位根反演#
单位根:
当
否则右边是一个等比数列,等于
用于模意义下的原根也是对的。
min-max 容斥#
以第一种形式为例,第
实际应用一般结合期望,也就是如果一个集合的期望最小不好求,可以去求他的期望最大。
高维前缀和#
二维前缀和:
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
a[i][j] += a[i - 1][j];
}
}
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
a[i][j] += a[i][j - 1];
}
}
三维前缀和:
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
for(int k = 1; k <= n; ++ k) {
a[i][j][k] += a[i - 1][j][k];
}
}
}
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
for(int k = 1; k <= n; ++ k) {
a[i][j][k] += a[i][j - 1][k];
}
}
}
for(int i = 1; i <= n; ++ i) {
for(int j = 1; j <= n; ++ j) {
for(int k = 1; k <= n; ++ k) {
a[i][j][k] += a[i][j][k - 1];
}
}
}
子集和:
用偏序的形式表示子集和,可以发现他就是一个
for(int i = 0; i < n; ++ i) { // 枚举维度,1011 用数组表示为 a[1][1][0][1]
for(int s = 0; s < 1 << n; ++ s) {
if(s >> i & 1) a[s] += a[s ^ 1 << i];
}
}
子集和还有分治做法。
对于一个
递归处理每个数在各自分治区间的子集和。
考虑合并两部分信息。
右边部分的第
因此右边再加上左半边对应的贡献就可求得当前分治区间的子集和。
时间复杂度
快速莫比乌斯变换#
集合幂级数
莫比乌斯变换即高维前缀和。
莫比乌斯逆变换即高维差分,都可以按维 dp 做到
集合并卷积(或卷积)#
求集合幂级数
先求出
推广:集合交卷积(与卷积)
同样令
类似的,只不过是高维前缀和换成高维后缀和。
集合无交并卷积(子集卷积)#
考虑在集合幂级数中引入未定元
对
两个集合无交当且仅当
因此有
我们把形式幂集数
每一行保留大小为
考虑
莫比乌斯变换是线性变换,不需要每做一次卷积就要逆变换,系数可以累加。
最后对每一行做莫比乌斯逆变换,时间复杂度
快速沃尔什变换#
- 注意
的范围是所有集合。
考虑分治。
对于
设
对于一个右侧元素
发现左侧对
右侧元素对
在
类似地考虑左半边,
沃尔什逆变换#
试着对
第二步中
我们发现只要将
集合对称差卷积(异或卷积)#
设
burnside 引理#
对于一个群
。 。 。 ,把 称作 的逆元。
如果
拉格朗日插值#
假设已知多项式
如果
这意味着我们只需
点值表示做乘法时只有
通过点值还原
CF722E Research Rover#
题意:
每次只能向右或向下走,求从
将关键点排序。
最终权值只与经过的关键点数有关,
不怎么好转移,定义
由于我们将方案根据恰好经过的第
当
CF1097G Vladislav and a Great Legend#
题意:给定一颗
其中
枚举虚树根
肯定是
我们需要考虑
虽然他们都不是红色子树中的边,但是与
设
注意这里选中的边不一定是生成树内部边,也有可能是生成树的根到
现在考虑
生成树内部以及生成树的根到
其中
注意这一部分的答案是要计入最终贡献的,因为统计的都是合法方案。
假设
现在要把一些只在
点集的根到
复杂度据说转移时对
CF1750G Doping#
题意:疑似有点太难了。
CF1967E1 Again Counting Arrays (Easy Version)#
题意:给定
由于要保证
。 。
如果其中出现
显然每个
第一种转移
如果第
时间复杂度
从另一个角度考虑这个问题,把
如果第
枚举
终点确定向右上和右下的步数也确定,往右上走对应
由于最后一步是确定的,反射容斥的终点设为
取阈值
P4221 [WC2018] 州区划分#
题意:
一个划分的满意度等于所有州的满意度之积。
第
给出每个城市的人口
记
枚举
把
令
把幂级数看作
时间复杂度
NFLSOJ 3392. 计算#
题意:定义
给出
求集合
观察
由于
枚举子集和:
考虑如果
那么有
(最小正周期内两两不同余是显然的,
因此:
说明这个乘积与
根据分圆多项式
暴力枚举因子,时间复杂度
NFLSOJ 5005. 礼物#
题意:计算有多少个不同的有
两个手环相同当且仅当它们可以通过旋转变得一模一样。
一共
考虑一种染色方案的最小正周期
如果存在
考虑枚举
假设已经特判掉
对于最左最右都不超过
上述方法多算了总和大于
考虑第一种情况,我们钦定总和大于
则这部分的贡献等于
考虑第二种情况,在钦定左边大于
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具