组合数学
排列组合
排列
从n个不同的元素中取出m个的方案数,记为A(n,m)或P(n,m)
组合
从n个相同的元素中取出m个的方案数,记为C(n,m)或\binom{n}{m}
隔板法
用m-1个相同隔板把n个相同元素分成m部分(可以有两个隔板插在同一个空隙)
方案数:C(n+m-1,m-1)=C(n+m-1,n)
容斥原理
不定方程非负整数解计数
给出不定方程\sum_{i=1}^n x_i=m和n个限制条件x_i\le b_i ,其中m,b_i\in \mathbb{N}。求方程的非负整数解的个数。
解
考虑求有限制x_i\geq b_i+1的不定方程非负整数解个数。
将每个有限制的x_i减去b_i+1,就去掉了限制。
这样,答案=\binom{m-1}{m+n-1}。
将原问题用容斥转化成上述问题计算即可。
数论中的容斥
欧拉函数,莫比乌斯反演
容斥原理一般化
二项式反演
证明
假设有n个集合A_i,任意k个集合的交集都是g_k,任意k个集合补集的交集都是f_k。由容斥原理,
应用
在实际应用中,我们往往设f(i)表示“恰好有i个”,g(i)表示“钦定选i个,其余随意”。
min-max容斥
证明
假设x是第k大元素,定义映射f:x\rightarrow {1,2,\dots,k}。
易得x,k,f(x)一一对应。
则f(\min(x,y))=f(x)\cap f(y),f(\max(x,y))=f(x)\cup f(y)
然后
即
上述式子在期望意义下也是成立的。
kth min-max容斥
证明
设\max_k(S)=\sum_{t\subseteq S} f(|T|) \min(T)
考虑构造容斥系数f(x)
考虑第x+1大的元素被统计到的贡献,为\sum_{i=0}^x \binom{x}{i} f(i+1)
则
二项式反演,得
卡特兰数
一个序列有n个0和n个1,保证每个1之前必有1个0的方案数为C(n)
递推式:(注意:括号里只有一个元素的是Catalan数,有两个元素的是组合数)
前几项是 1 2 5 14 42 132 429 1430 4862 16796 ,混着眼熟
斯特林数
第一类斯特林数
把n个元素摆成m个圆排列的方案数,记为s(n,m)
递推式:
常见应用
第二类斯特林数
把n不同的球放在m个相同的盒子(无空盒)里的方案数,记为S(n,m)
递推式:
常见应用
斯特林反演
错位排列
递推式:f[n]=(n-1)*(f[n-1]+f[n-2])
当 n 很大时, f[n] \approx \frac{n!}{e}
证明:
- n-1 个人已经完成错排,第 n 个人和任意一个人交换
- n-1 个人中的一个和第 n 个人交换,其余 n-2 个人已经完成错排
经典的放球问题
为方便表达,我们设方案数为N,n个球,m个盒
1. 球不同,盒不同,有空盒
根据乘法原理可得。
2. 球不同,盒不同,无空盒
(1) n>=m
球不同,盒相同的方案数\times m!
(2) n<m
3. 球不同,盒同,有空盒
因为允许空盒,所以球可以只放在m个盒中的1个或2个或...或m-1个盒中
4. 球不同,盒同,无空盒
(1) n>=m
由第二类斯特林数的定义。
(2) n<m
5. 球同,盒不同,有空盒
插板法,即把n个球用m-1个隔板分成m部分。
6. 球同,盒不同,无空盒
(1) n>=m
先在每个盒子里放一个球,方案数为1;再对剩下的n-m个球用隔板法,即把n-m个球用m-1个隔板分成m部分。
(2) n<m
7. 球同,盒同,有空盒
(1) n>=m
我们发现,当n=5,m=3时的方案为:
5 0 0
4 1 0
3 2 0
3 1 1
2 2 1
共5种方案。
我们发现,问题可以转化为:把正整数n分解成不超过m个自然数的方案数。如果暴力dfs,时间复杂度为O(爆炸)。竟然还有70分
有一个重要结论:把正整数n分解成不超过m个自然数的方案数,等于把正整数n分解成若干个\le m的自然数的方案数。这个定理的证明方法,请自行百度。(我也不会)
我们考虑使用母函数:对于分解出的每个\le m的整数i,我们用多项式表示为$$(xi+x+...+x^{floor(\frac{n}{i})*i})$$
此处floor(x)表示x向下取整。
于是,母函数G(x):$$G(x)=\prod_{i=1}{m}(xi+x{2i}+...+x)*i})$$
求出x^n的系数即可。
(2) n<m
\color{white}{???}
8. 球同,盒同,无空盒
(1) n>=m
母函数$$G(x)=\prod_{i=1}{m}(xi+x{2i}+...+x)*i})$$
中x^{n-m}的系数。
(2) n<m
生成函数
引子
砝码称重问题
有1g砝码5个,2g砝码3个,5g砝码2个。相同质量的砝码完全相同。问有多少种能称出15g的方案?
解
很容易想到暴力枚举每一种可能的称量方案,但是时间复杂度为O(n^n)级别,计算机无法承受。于是我们引入母函数的概念。设G(x)为母函数,对于1g的砝码能称出的不同重量,我们用多项式表示为$$(x1+x2+...+x{15})同理,2g砝码能表示为(x2+x4+...+x)5g砝码能表示为(x5+x+x^{15})
于是G(x)=(x1+x2+...+x{15})(x2+x4+...+x)(x5+x+x^{15})$$
经过化简,求出x^{15}的系数,即为答案。
由于只需化简多项式,母函数的时间复杂度仅为O(n^3),空间复杂度为O(n),得到巨大提升。
使用fft可以进一步优化。
OGF
序列a的普通生成函数:F(x)=\sum_{n} a_nx^n
基本运算律
设F(x)是a的OGF,G(x)是b的OGF,则:
- F(x)\pm G(x)是a\pm b的OGF
- F(x)G(x)是\sum_{i=0}^n a_ib_{n-i}的OGF
常见封闭形式
封闭形式的展开
斐波那契数列
设
通分,解得
即
广义二项式定理
卡特兰数
H(x)=\frac{1-\sqrt{1-4x}}{2x}
对\sqrt{1-4x}用广义二项式定理展开,代回原式,得
EGF
序列a的指数生成函数:F(x)=\sum_{n} a_n\frac{x^n}{n!}
基本运算律
设F(x)是a的EGF,G(x)是b的EGF,则:
- F(x)\pm G(x)是a\pm b的EGF
- F(x)G(x)是\sum_{i=0}^n \binom{n}{i}a_ib_{n-i}的EGF
泰勒展开
我们用下式表示f(x)在x_0处的泰勒展开式
其中R_n(x)是(x-x_0)^n的高阶无穷小。
直观理解
常见封闭形式
排列与圆排列
长为n的排列的EGF:P(x)=\sum_{n\geq 0}\frac{n!x^n}{n!}=\frac{1}{1-x}
长为n的圆排列的EGF:Q(x)=\sum_{n\geq 0}\frac{(n-1)!x^n}{n!}=\ln(\frac{1}{1-x})
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用