序
求将 n n 个无标号元素用 m − 1 m − 1 个隔板分入 m m 个有标号可空集合的方案数。
或
求不定方程
x 1 + x 2 + ⋯ + x m = n ( m , n ∈ N + , m ≤ n ) x 1 + x 2 + ⋯ + x m = n ( m , n ∈ N + , m ≤ n )
的非负整数解的个数。
是一个非常经典的组合问题,众所周知其答案为组合数 ( n + m − 1 m − 1 ) ( n + m − 1 m − 1 ) ,这可以根据其组合意义结合隔板法容易的得到。
然而,笔者发现还有很多有趣的方法可以得到上式,值得探讨一番。
组合意义
如上文所说,组合意义可以结合隔板法容易的得到。考虑将 n n 个无标号元素用 m − 1 m − 1 个隔板分入 m m 个有标号非空集合,其方案数为 ( n − 1 m − 1 ) ( n − 1 m − 1 ) 。然而我们需要的是各集合可空情况下的方案数。考虑新增 m m 个元素,先给每个集合放一个元素垫底,再做各组可空的分配。这个小Trick让我们将问题转化为求 n + m n + m 个无标号元素分入 m m 个非空有标号集合的方案数。再用隔板法,得到答案 ( n + m − 1 m − 1 ) ( n + m − 1 m − 1 ) 。
形式化的,我们令 y i = x i + 1 y i = x i + 1 ,则我们现在只需求 y 1 + y 2 + ⋯ + y m = n + m y 1 + y 2 + ⋯ + y m = n + m 的正整数解,隔板法得到答案 ( n + m − 1 m − 1 ) ( n + m − 1 m − 1 ) 。
枚举空位——范德蒙德卷积公式
我们使用另一种方法将隔板法应用到可空集合上。
枚举 m m 个集合中有几个是空集,可以得到下式
a n s = m − 1 ∑ k = 0 ( m k ) ( n − 1 m − k − 1 ) a n s = ∑ k = 0 m − 1 ( m k ) ( n − 1 m − k − 1 )
又由范德蒙德卷积公式
( n + m k ) = min ( n , k ) ∑ i = max ( 0 , k − m ) ( n i ) ( m k − i ) ( n + m k ) = ∑ i = max ( 0 , k − m ) min ( n , k ) ( n i ) ( m k − i )
(范德蒙德卷积公式易由 ( 1 + x ) n + m = ( 1 + x ) n ( 1 + x ) m ( 1 + x ) n + m = ( 1 + x ) n ( 1 + x ) m 的二项式展开说明)
可直接得到( k ′ = m − 1 k ′ = m − 1 , n ′ = m n ′ = m , m ′ = n − 1 m ′ = n − 1 )
a n s = min ( m , m − 1 ) ∑ k = max ( 0 , ( m − 1 ) − ( n − 1 ) ) ( m k ) ( n − 1 m − k − 1 ) = ( n + m − 1 m − 1 ) a n s = ∑ k = max ( 0 , ( m − 1 ) − ( n − 1 ) ) min ( m , m − 1 ) ( m k ) ( n − 1 m − k − 1 ) = ( n + m − 1 m − 1 )
递推——杨辉三角
这固然很妙,但要是我想不到这些Trick怎么办?
不会通项就设状态dp呗(反正是OIer有电脑帮我算
设状态 f ( n , m ) f ( n , m ) 表示将 n n 个无标号元素放入 m m 个有标号可空集合的方案数。
考虑当前正在为第 n n 个元素确定所属集合。既然元素是无标号的,不妨按升序排列集合。于是放入新的元素时,只需决定要先跳过多少个集合再放入。易得下面的递推式
f ( n , m ) = m ∑ k = 1 f ( n − 1 , k ) f ( n , m ) = ∑ k = 1 m f ( n − 1 , k )
初始状态满足
f ( 0 , m ) = 1 f ( n , 0 ) = [ n = 0 ] ( n , m ∈ N ) f ( 0 , m ) = 1 f ( n , 0 ) = [ n = 0 ] ( n , m ∈ N )
(中括号是艾弗森括号)
不妨列出 f f 的前几项——
n\m m0 m1 m2 m3 m4
n0 1 1 1 1 1
n1 0 1 2 3 4
n2 0 1 3 6 10
n3 0 1 4 10 20
很熟悉...这是杨辉三角!
可以由递推式得到杨辉三角的特征——
f ( n , m ) = f ( n − 1 , m ) + m − 1 ∑ k = 1 f ( n − 1 , k ) = f ( n − 1 , m ) + f ( n , m − 1 ) f ( n , m ) = f ( n − 1 , m ) + ∑ k = 1 m − 1 f ( n − 1 , k ) = f ( n − 1 , m ) + f ( n , m − 1 )
那么,只需观察并将表格的每一项映射到杨辉三角,我们就能得到 f ( n , m ) = ( n + m + 1 m − 1 ) f ( n , m ) = ( n + m + 1 m − 1 ) 。
生成函数——广义二项式定理
要是我连杨辉三角都没看出来怎么办
方便起见,此处我们不研究 m = 0 m = 0 的情况。不妨设
g ( n , m ) = f ( n , m + 1 ) g ( n , m ) = f ( n , m + 1 )
显然, g g 的递推式为
g ( n , m ) = m ∑ k = 0 g ( n − 1 , k ) g ( n , m ) = ∑ k = 0 m g ( n − 1 , k )
据此我们发现,每一排是其前一排的前缀和数组,或者换句话说,每一排是其后一排的向前差分数组。我们先拿出 n = 0 n = 0 一排的OGF
g 0 ( x ) = 1 1 − x g 0 ( x ) = 1 1 − x
又根据差分
g n ( x ) = g n + 1 ( x ) − x g n + 1 ( x ) ⟺ g n + 1 = 1 1 − x g n ( x ) g n ( x ) = g n + 1 ( x ) − x g n + 1 ( x ) ⟺ g n + 1 = 1 1 − x g n ( x )
得
g n ( x ) = ( 1 − x ) − ( n + 1 ) g n ( x ) = ( 1 − x ) − ( n + 1 )
又由广义二项式定理
( x + y ) α = ∞ ∑ k = 0 ( α k ) x k y α − k ( x + y ) α = ∑ k = 0 ∞ ( α k ) x k y α − k
其中
( α k ) = α ( α − 1 ) … ( α − k + 1 ) k ! ( α k ) = α ( α − 1 ) … ( α − k + 1 ) k !
展开,得到
g n ( x ) = ∞ ∑ k = 0 ( − n − 1 k ) ( − 1 ) k x k g n ( x ) = ∑ k = 0 ∞ ( − n − 1 k ) ( − 1 ) k x k
故
g n ( x ) [ x k ] = ( − 1 ) k ( − n − 1 k ) = ( − 1 ) k ( − n − 1 ) ( − n − 2 ) … ( − n − k ) k ! = ( n + 1 ) ( n + 2 ) … ( n + k ) k ! = ( n + k k ) g n ( x ) [ x k ] = ( − 1 ) k ( − n − 1 k ) = ( − 1 ) k ( − n − 1 ) ( − n − 2 ) … ( − n − k ) k ! = ( n + 1 ) ( n + 2 ) … ( n + k ) k ! = ( n + k k )
即
g ( n , k ) = ( n + k k ) g ( n , k ) = ( n + k k )
换回 f f 表示就得到答案
f ( n , m ) = g ( n , m − 1 ) = ( n + m − 1 m − 1 ) f ( n , m ) = g ( n , m − 1 ) = ( n + m − 1 m − 1 )
Burnside——第一类斯特林数
如果要分组的 n n 个元素是有标号的,问题将会简单很多——直接枚举每个元素的所属集合即可,显然方案数为 m n m n 。
但关键是它们没有标号。
无标号的本质是认为任意置换标号前后是同构的。这启发我们将所有 n n 元置换(即置换群)作为变换集,使用等价类计数Burnside来解决该问题。
根据Burnside定理
a n s = 1 | G | ∑ f ∈ G C ( f ) a n s = 1 | G | ∑ f ∈ G C ( f )
其中 G G 是变换集, C ( f ) C ( f ) 是变换 f f 的不动点。
可以写出
a n s = 1 n ! ∑ p ∈ p e r m ( n ) m c y c ( p ) a n s = 1 n ! ∑ p ∈ p e r m ( n ) m c y c ( p )
其中 p e r m ( n ) p e r m ( n ) 表示所有 n n 元置换的集合,而 c y c ( p ) c y c ( p ) 指置换 p p 的形成的置换图中环的个数。
在外层枚举 c y c ( p ) c y c ( p ) ,得
a n s = 1 n ! n ∑ k = 1 m k ∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ] a n s = 1 n ! ∑ k = 1 n m k ∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ]
∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ] ∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ] 是什么?
第一类斯特林数 [ n k ] [ n k ] 表示将 n n 个有标号元素分成 k k 个无标号圆排列的方案数。
在置换图中, p i p i 表示节点 i i 的下一个节点是 p i p i 。而枚举置换的过程,正是枚举置换图的过程,也正是枚举圆排列的过程!而 [ c y c ( p ) = k ] [ c y c ( p ) = k ] 则为我们确定了环,或者说圆排列的个数。
惊讶的,我们发现
[ n k ] = ∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ] [ n k ] = ∑ p ∈ p e r m ( n ) [ c y c ( p ) = k ]
带入其中,答案式变为
a n s = 1 n ! n ∑ k = 1 [ n k ] m k a n s = 1 n ! ∑ k = 1 n [ n k ] m k
于是,根据第一类斯特林数性质之一
n ∑ k = 1 [ n k ] m k = m ( m + 1 ) … ( n + m − 1 ) ∑ k = 1 n [ n k ] m k = m ( m + 1 ) … ( n + m − 1 )
(该性质可以结合第一类斯特林数的递推式做数学归纳得出)
我们愉快的得到了答案
a n s = m ( m + 1 ) … ( n + m − 1 ) n ! = ( n + m − 1 m − 1 ) a n s = m ( m + 1 ) … ( n + m − 1 ) n ! = ( n + m − 1 m − 1 )
用Burnside解决无标号问题的思路极具启发性,例如烷基计数 问题的Burnside解法。
后记&致谢
同分异构体计数带我重回OI
感谢TbYangZ菊苣全程提供技术支持。
感谢神仙化学老师提供组合意义解释。
2021/05/01
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!