组合数学习笔记

组合数#

定义#

普通定义#

(nm)=n!m! (nm)!

这里,当 n<m 时,认为该式值为 0

扩展定义#

(nm)=nm_m!(nC,mN)

基本性质#

对称性#

(nm)=(nnm)

显然。

加法公式#

(nm)=(n1m)+(n1m1)

证明:组合意义。

n 中选 m 个,可分为两种情况:

  • 选第 n 个,则需在前 n1 个中选 m1 个。
  • 否则需在前 n1 个中选 m 个。

上指标求和#

i=0n(ik)=(n+1k+1)

证明:数学归纳法。

  • n=k 时,显然有 (kk)=(k+1k+1)
  • n>k 时,设结论在 N[0,n1] 上成立,根据加法公式,有:

(n+1k+1)=(nk)+(nk+1)=(nk)+i=0n1(ik)=i=0n(ik)

因此,结论成立。

吸收恒等式#

m(nm)=n(n1m1)

(nm)(mk)=(nk)(nkmk)

证明:第一个式子显然是第二个式子在 k=1 时的特殊情况,所以只需证明第二个式子。

组合意义。从 n 中选出 m 个,再从这 m 个中选 k 个,等价于先从 n 中选出 k 个,再把这 k 个与另外 mk 个凑出 m 个。

范德蒙德卷积#

i+j=m=(ki)(nkj)=i=0m(ki)(nkmi)=(nm)

证明:组合意义。考虑前 k 个选几个,把所有情况相加即可。

其他#

i=0ni(ni)=2n1ni=0ni2(ni)=2n2n(n+1)

二项式定理

(a+b)n=i=0n(ni)aibni

证明:考虑展开 (a+b)n 后,aibni 的系数,显然为在 n(a+b) 中选 ia 的情况总数。

广义二项式定理#

(x+y)α=k0(αk)xkyαk(αR)

练习 1#

求:

i=0n(nii)

解:设原式为 f(n)

f(n)=i=0n(nii)=i=0n(n1ii)+(n1ii1)=i=0n1(n1ii)+i=1n1(n1ii1)=i=0n1(n1ii)+i=0n2(n2ii)=f(n1)+f(n2)

f(0)=1,f(1)=1,故 f(n)=Fn+1,其中 Fi 表示斐波那契数列的第 i 项。

另一种方法是利用斐波那契数列的组合意义。
求一个 2×n 的棋盘,使用任意多张 1×2 的骨牌 完全 覆盖所有格子的方案数。设有 fn 种方案。
讨论第 n 列是被一张竖着放的骨牌覆盖,还是被两张横着放的骨牌覆盖,即可得知 fn=fn1+fn2

由于边界为 f0=1,因此 fn=Fn+1。用组合数计算。若有 2i 张横着放置的骨牌,则一对在同一列上的骨牌会占据两列。
所以先减去 i 列(肯定会被占用),然后从剩下的列中选 i 列就是答案。所以 fn=i=0n(nii)

练习 2#

求:

i=0n(m+i1i)

解:

i=0n(m+i1i)=i=0n(m+i1m1)=i=0m+n1(im1)=(m+nm)

第一步和第三步分别运用了对称性、上指标求和。

斯特林数#

第二类斯特林数#

定义#

{nm} 表示将 n 个不同的元素划分为 m 个互不区分的非空集合的方案数。

性质#

{nm}={n1m1}+m{n1m}

边界:{n0}=[n=0]

第一类斯特林数#

定义#

n 个人坐在 m 张非空圆桌上的方案数记为第一类斯特林数,用 [nm] 表示。

性质#

[nm]=[n1m1]+(n1)[n1m]

边界:[n0]=[n=0]

下降幂和上升幂#

定义#

an_=k=an+1ak

an¯=k=aa+n1k

斯特林数的性质#

下降幂、上升幂与幂的转化#

xm¯=k=0m[mk]xkxm_=k=0m(1)mk[mk]xkxm=k=0m{mk}xk_

通项公式#

{mk}=1k!i=0k(1)ki(ki)im

容斥原理#

基本公式#

S 为有限集,A1,A2,,AnSA={A1,A2,,An} 则有:

|i=1nAi|=k=1n(1)k11i1<i2<<ikn|j=1kAij|

证明:

设一个元素被 A 中的 m 个集合包含,则它对左侧贡献为 1
它对右侧的贡献为:i=1m(1)i1(mi)(从这 m 个集合中任选几个集合都会包含)

=i=1m(1)i(mi)=1i=0m(1)i(mi)=1(11)m=1

德 · 摩根定律#

i=1nAi¯=i=1nAi¯i=1nAi¯=i=1nAi¯

基本公式的变形#

根据德摩根定律变形:

|i=1nAi¯|=|i=1nAi¯|=|S|k=1n(1)k11i1<i2<<ikn|j=1kAij|=|S|+k=1n(1)k1i1<i2<<ikn|j=1kAij|

|i=1nAi|=|i=1nAi¯¯|=|S|k=1n(1)k11i1<i2<<ikn|j=1kAij¯|=|S|+k=1n(1)k1i1<i2<<ikn|j=1kAij¯|

子集反演#

定义在两个集合上的函数 f,g,若

f(S)=TSg(T)

g(S)=TS(1)|S||T|f(T)

以后有时间再证明吧。感觉和二项式反演的证明思路可能差不多。

二项式反演#

这是子集反演的特殊情况:多个集合的交集大小只和集合数目有关,而与具体是哪些集合无关。

我们用 g(i) 表示某 i 个补集的交集大小(即不满足某 i 个条件的方案数),
f(i) 表示某 i 个原集的交集大小(即钦定 / 至少满足某 i 个条件的方案数)。
特别地,f(0)=g(0)=|S|,因为 0 个条件相当于任意情况。

根据上面的变形公式,我们有:

f(n)=|S|+k=1n(1)k(nk)g(k)=k=0n(1)k(nk)g(k)g(n)=|S|+k=1n(1)k(nk)f(k)=k=0n(1)k(nk)f(k)

h(k)=(1)kg(k) 再代进去,可以得出:

f(n)=k=0n(nk)h(k)h(n)=k=0n(1)n+k(nk)f(k)=k=0n(1)nk(nk)f(k)

能得出二项式反演:

f(n)=k=0n(nk)h(k)h(n)=k=0n(1)nk(nk)f(k)

另一种表述是,若两个序列 f,g 满足:

fn=i=0n(ni)gi

gn=i=0n(1)ni(ni)fi

是其充分必要条件。

这里的 f,g 貌似代表什么都可以。
也就是说,我们可以不关心其具体意义,只要在推出这种式子时,知道它能够与另一个式子相互转化就可以了。

也可以用代入法证明(下面为了方便,把序列形式改成了函数形式)。

f(n)=i=0n(1)i(ni)g(i)=i=0n(1)i(ni)j=0i(1)ij(ij)f(j)=i=0nj=0i(1)ij(ni)(ij)f(j)=j=0nf(j)i=jn(1)ij(ni)(ij)=j=0n(nj)f(j)i=jn(1)ij(njij)=j=0n(nj)f(j)k=0nj(1)k(njk)=j=0n(nj)f(j)(11)nj

这时我们不能直接把后面那项变为 1,需要分类讨论。

  • nj0 时,(11)nj=0
  • 否则,回到上式,其值为 k=00(0k)=(00)=1
  • 综上,j=0n(nj)(11)nj=1

最终,得出了 f(n)=f(n),证毕。

另外一种二项式反演的式子也比较常用:

f(n)=i=nm(in)g(i)g(n)=i=nm(1)in(in)f(i)

证明为把右侧代入左侧,不再赘述。

这个式子的组合意义为 f(n) 表示钦定选 n 个,g(n) 为恰好选 n 个的方案数。如果选择这种组合意义,那么 f(n) 是一个无效的数,因为钦定 n 个表明存在重复的情况。所以“钦定”只能作为转化的工具,在题目中不能独立存在。同样地,在计算 f 时也不要刻意去重,因为“钦定”的性质已经表明 f 很可能存在重复情况。

应用#

题目常让我们求:

  • 至少满足一个条件(所有集合并集大小)
  • 恰好满足所有条件(所有集合交集大小)

然而,我们能求的是:

  • 至少满足某 k 个条件 (某 k 个集合交集大小)

我们运用上面的公式转化一下就可以了。

P6076[JSOI2015]染色问题#

先考虑颜色。“每种颜色在棋盘上至少出现一次”就是“每种颜色都要出现”。

套二项式反演:

gA(c)=i=0c(1)ci(ci)fA(i)

对于行,我们可以强制它满足限制。也就是在计算列的时候,把方案数减一。

考虑列。

套二项式反演:

gB(m)=i=0m(1)mi(mi)fB(i)

fB(i)=((k+1)i1)n

fA(k)=gB(m)=i=0m(1)mi(mi)((k+1)i1)n

再代回就可以了。

推导第二类斯特林数的通项公式#

复习一下,{mk} 定义是
m 个不同的元素划分为 k 个互不区分的非空集合的方案数。

设数列 gk 表示将 m 个互不相同的元素划分为 k 个有区别集合的方案数,
fk 表示将 m 个互不相同的元素划分为 k 个有区别非空集合的方案数。
那么显然,gk=km

通过枚举非空集合的个数,可以得知:

gk=i=0k(ki)fi

套用二项式反演:

fk=i=0k(1)ki(ki)gi

由于斯特林数中,集合互不区分,故 {mk}=fkk!

所以得出结论:

{mk}=1k!i=0k(1)ki(ki)im

posted @   hihihi198  阅读(227)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示
主题色彩