【笔记】组合数学:从阶乘幂到斯特林数

OI-wiki 抄一点,《具体数学》抄一点,抄抄你的,抄抄他的

斯特林数 - OI Wiki (oi-wiki.org)

斯特林数及斯特林反演 - y2823774827y - 博客园 (cnblogs.com)

阶乘幂

我们记下降阶乘幂

xn=x!(xn)!=k=0n1(xk)

上升阶乘幂

xn=(x+n1)!(x1)!=k=0n1(x+k)

特别地有 x0=x0=1,如果不能算负整数的阶乘,那么就用最右边的定义。

吸收恒等式

mk(nm)=nk(nkmk)

组合证明:有 n 个有标号小球,先无序地选出 m 个,再从 m 个中有序地选出 k 个,等价于选从 n 个中有序地选出 k 个,再从剩下的小球中无序地选出 mk 个。

代数证明:两边都等于 nm/(mk)!。需要用到的公式:

(nm)=nm/m!nm=m!(nm)

nk(nk)mk=nm

第二条由其因式分解形式容易证明。

上下阶乘幂互转

由因式分解形式可以发现

xk=(1)k(x)k

或另一个感觉没啥用的

xk=(xk+1)k

下降幂的差分

(x+1)mxm=mxm1

这个涉及的是《具体数学》中提到的“有限微积分”。

下降幂二项式定理

(x+y)n=i=0n(ni)xiyni

(x+y)n=i=0n(ni)xiyni

与范德蒙德卷积进行对比,发现事实上范德蒙德卷积可以看作是“组合数二项式定理”。下降幂二项式定理可以由范德蒙德卷积推导得到。

(a+bn)=i=0n(ai)(bni)

第二类斯特林数

第二类斯特林数(斯特林子集数)记作 {nk} 可读作“n 子集 k”,表示将 n 个两两不同的元素划分为 k 个互不区分的非空子集的方案数。

递推式

{nk}=k{n1k}+{n1k1}

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

组合意义证明

考虑用组合意义来证明。

我们插入一个新元素时,有两种方案:

  • 将新元素单独放入一个子集,有 {n1k1} 种方案;
  • 将新元素放入一个现有的非空子集,有 k{n1k} 种方案。

根据加法原理,将两式相加即可得到递推式。

重要公式:普通幂转下降幂

xn=k{nk}xk

k[0,n],因为根据定义其它位置不可能有值。证明是归纳法。

证明(来源《具体数学》)

n=0 时显然成立;若已知 n1 情况成立,则因为 xk+1=xk(xk),所以 xk+1+kxk=xxk

xxn1=xk{n1k}xk=k{n1k}xk+1+k{n1k}kxk=k({n1k1}+k{n1k})xk=k{nk}xk

第一类斯特林数

第一类斯特林数(斯特林轮换数)记作 [nk] 可读作“n 轮换 k”,表示将 n 个两两不同的元素划分为 k 个互不区分的非空轮换的方案数。轮换指的是首尾相接的排列(圆排列)。

递推式

[nk]=(n1)[n1k]+[n1k1]

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

组合意义证明

考虑用组合意义来证明。

我们插入一个新元素时,有两种方案:

  • 将新元素单独放入一个轮换,有 [n1k1] 种方案;
  • 将新元素放入一个现有的非空轮换。这部分有点智慧,你需要知道将一个数插入到 j 阶轮换中有 j 种方法(随意选一个间隔插进去),所以考虑所有轮换的阶数和,有 (n1)[n1k] 种方案。

根据加法原理,将两式相加即可得到递推式。

重要公式:上升幂转普通幂

xn=k[nk]xk

证明(来源《具体数学》)

n=0 时显然成立;若已知 n1 情况成立,则因为 (x+n1)xk=xk+1+(n1)xk,所以

(x+n1)xn1=(x+n1)k[n1k]xk=k[n1k]xk+1+k[n1k](n1)xk=k([n1k1]+(n1)[n1k])xk=k[nk]xk

同一行或列的斯特林数的计算

同一行第二类斯特林数的计算

这个可能是较重要的。

现在有 n 个有标号的球,令 f(m) 表示将它们放入 m 个有标号的盒子中且要求盒子非空,g(m) 表示将它们放入 m 个有标号的盒子中且要求盒子非空,则有

g(m)=mn=k=0m(mk)f(k)

施二项式反演:

f(m)=k=0m(mk)(1)mkg(k)

因为

f(m)=m!{nm}

所以

{nm}=1m!k=0m(mk)(1)mkkn

两类斯特林数的比较与联系

递推式

{nk}=k{n1k}+{n1k1}

[nk]=(n1)[n1k]+[n1k1]

幂的转换

首先有一个直观感受,当 x>m>0

xm<xm<xm

这里为了美观折叠一大段推导

然后有普通幂转下降幂公式,记为 xmxm

xn=k{nk}xk

我们很早就发现了

(x)k=(1)kxk

公式 xmxm 带入 x

(1)nxn=k{nk}(1)kxk

所以推出了公式 xmxk

xn=k{nk}(1)nkxk

同样道理,可以由 xmxk 推出 xkxm

下面可以看一下阶乘幂和普通幂相互转化的四条公式:

xn=k{nk}xk(xmxm)

xn=k[nk]xk(xmxm)

xn=k{nk}(1)nkxk(xmxm)

xn=k[nk](1)nkxk(xmxm)

总的来说:

  • xmxmxm 这一条链上,从左往右逐渐往大的幂靠近,用小的幂组合成大的幂,不带负号,先子集数再轮换数。
  • xmxmxm 这一条链上,从右往左逐渐往小的幂靠近,用大的幂组合成小的幂,带负号,也是先子集数再轮换数。

反转公式

k=mn(1)nk{nk}[km]=[m=n]

k=mn(1)nk[nk]{km}=[m=n]

所有 (1)nk(1)km 也都是对的。

证明

对于第一个:非常简单,将公式 xmxm 代入到 xmxm,得到

xn=m{nm}k[mk](1)mkxk

左式展开之后,必然只有 xn 项系数有值,而且是 1,其它项都是 0,仅当 k=n 时对应的系数是 1,然后改写一下字母就得到了原式。

这个 1 上面的指数到底是 km 还是 nk,其实这应该是没关系的,给一个零取相反数不会导致什么,而当 n=m 时左边就只有一项。

或者将公式 xmxm 带入到 xmxm

xn=k{nk}(1)nkxk=k{nk}(1)nkm[km]xm

得到原式,也就是说 1 的指数是无所谓的。

对于第二个:应该是相同的,将公式 xmxm 代入 xmxm,后面反正都一样就不写了。

斯特林数反演

f(n)=k=0n{nk}g(k)g(n)=k=0n(1)nk[nk]f(k)

f(n)=k=0n[nk]g(k)g(n)=k=0n(1)nk{nk}f(k)

证明

反转公式的直接应用。以第一个为例。

f(n)=k=0n{nk}g(k)=k=0n{nk}m=0k(1)km[km]f(m)=m=0nk=mn{nk}(1)km[km]f(m)=m=0n[n=m]f(m)=f(n)

应用

posted @   caijianhong  阅读(97)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2023-09-11 【模板】数据结构:左偏树(可并堆) 、k 短路、最小树形图
2023-09-11 题解 Gym 104531D【Coffee】
2023-09-11 题解 ZROI2275【[22C-day5] String】
点击右上角即可分享
微信分享提示