斯特林数
生成函数
同一列第二类斯特林数:一个盒子的 egf 是 e x − 1 e x − 1 ,有 k k 个盒子但是盒子之间无区分,所以同一列斯特林数的 egf 是 ( e x − 1 ) k / k ! ( e x − 1 ) k / k ! .还有一个东西是根据它的递推式解出来 ogf 是 x k ∏ ( 1 − i x ) x k ∏ ( 1 − i x ) .
如果不限定盒子个数,那么 egf 是 exp ( e x − 1 ) exp ( e x − 1 ) ,这就是贝尔数的 egf。
同一行第二类斯特林数:利用 egf 列通项:{ n k } = n ! k ! [ x n ] k ∑ i = 0 ( k i ) e i ( − 1 ) k − i = k ∑ i = 0 i n ( − 1 ) k − i i ! ( k − i ) ! { n k } = n ! k ! [ x n ] ∑ i = 0 k ( k i ) e i ( − 1 ) k − i = ∑ i = 0 k i n ( − 1 ) k − i i ! ( k − i ) ! ,对所有 k k 求这个式子的值于是卷积计算。
同一列第一类斯特林数:单个轮换 egf 是置换 egf 取 ln,而置换 egf 是 1 1 − x 1 1 − x 那么轮换的 egf 是 ln ( 1 1 − x ) = − ln ( 1 − x ) ln ( 1 1 − x ) = − ln ( 1 − x ) ,和上面同理计算其 k k 次方除掉 k ! k ! 就行。
同一行第一类斯特林数:利用递推式解出来 ogf 是 x ¯ ¯ ¯ n x n ¯ ,直接分治 ntt 是 2log。
套路是给定 F ( x ) F ( x ) 的系数,可以通过一次卷积求出 F ( x + c ) F ( x + c ) 的系数,列出式子之后交换求和号,发现是个差卷积的形式。利用这个将所有 x ¯ ¯¯ ¯ 2 i x 2 i ¯ 算出之后选取一些乘起来,复杂度是 T ( n ) = T ( n / 2 ) + O ( n log n ) = O ( n log n ) T ( n ) = T ( n / 2 ) + O ( n log n ) = O ( n log n ) .
幂之间的转换
x n = ∑ k { n k } x k – – x ¯ ¯ ¯ n = ∑ k [ n k ] x k x n = ∑ k { n k } x k _ x n ¯ = ∑ k [ n k ] x k
这个应该怎么记忆,x ¯ ¯ ¯ n ≥ x n ≥ x n – – x n ¯ ≥ x n ≥ x n _ ,所以应该是若干个下降幂乘上一个什么系数得到普通幂,普通幂得到上升幂。利用 x n – – = ( − 1 ) n ( − x ) ¯ ¯ ¯ n x n _ = ( − 1 ) n ( − x ) n ¯ 再还元就能得到:
x n = ∑ k { n k } ( − 1 ) n − k x ¯ ¯ ¯ k x n – – = ∑ k [ n k ] ( − 1 ) n − k x k x n = ∑ k { n k } ( − 1 ) n − k x k ¯ x n _ = ∑ k [ n k ] ( − 1 ) n − k x k
反转公式
上一节中把其中一个往另一个式子的右侧代入,能够得到四个比较对称的式子,两边提取 [ x n ] [ x n ] 就得到了 [ n = m ] [ n = m ] 的展开,为了更好记忆这里记作 [ l = r ] [ l = r ] ,那么就有:
r ∑ k = l { r k } [ k l ] ( − 1 ) k − l = [ l = r ] r ∑ k = l { r k } [ k l ] ( − 1 ) r − k = [ l = r ] r ∑ k = l [ r k ] { k l } ( − 1 ) k − l = [ l = r ] r ∑ k = l [ r k ] { k l } ( − 1 ) r − k = [ l = r ] ∑ k = l r { r k } [ k l ] ( − 1 ) k − l = [ l = r ] ∑ k = l r { r k } [ k l ] ( − 1 ) r − k = [ l = r ] ∑ k = l r [ r k ] { k l } ( − 1 ) k − l = [ l = r ] ∑ k = l r [ r k ] { k l } ( − 1 ) r − k = [ l = r ]
这四个式子非常对称,仅需要记忆 { r k } [ k l ] { r k } [ k l ] 和 [ r k ] { k l } [ r k ] { k l } 可以互换;( − 1 ) k − l ( − 1 ) k − l 和 ( − 1 ) r − k ( − 1 ) r − k 可以互换就能把这些记住。
斯特林反演
f ( n ) = n ∑ i = 0 { n i } g ( i ) ⟺ g ( n ) = n ∑ i = 0 ( − 1 ) n − i [ n i ] f ( i ) f ( n ) = ∑ i = 0 n { n i } g ( i ) ⟺ g ( n ) = ∑ i = 0 n ( − 1 ) n − i [ n i ] f ( i )
证明(来自 cjl)
尝试利用 egf 解决问题,令 F , G F , G 为 f , g f , g 的 egf:
F ( x ) = ∑ k f k x k k ! = ∑ k = 0 x k k ! { k i } g i = ∑ i g i ∑ k = i { k i } x k k ! = ∑ i = 0 g i ( e x − 1 ) i i ! = G ( e x − 1 ) F ( x ) = ∑ k f k x k k ! = ∑ k = 0 x k k ! { k i } g i = ∑ i g i ∑ k = i { k i } x k k ! = ∑ i = 0 g i ( e x − 1 ) i i ! = G ( e x − 1 )
e x − 1 e x − 1 的复合逆是 ln ( 1 + x ) ln ( 1 + x ) ,于是有 F ( ln ( 1 + x ) ) = G ( x ) F ( ln ( 1 + x ) ) = G ( x ) ,那么对于另一方向:
G ( x ) = ∑ k f k ln ( 1 + x ) k k ! = ∑ k f k ( − 1 ) k ( − ln ( 1 − ( − x ) ) ) k k ! = ∑ k f k ( − 1 ) k ∑ i = k [ i k ] ( − x ) i i ! = ∑ i x i i ! ∑ k = i [ i k ] ( − 1 ) i − k f k G ( x ) = ∑ k f k ln ( 1 + x ) k k ! = ∑ k f k ( − 1 ) k ( − ln ( 1 − ( − x ) ) ) k k ! = ∑ k f k ( − 1 ) k ∑ i = k [ i k ] ( − x ) i i ! = ∑ i x i i ! ∑ k = i [ i k ] ( − 1 ) i − k f k
类比二项式反演,尝试证另一个方向的斯特林反演:
f ( m ) = ∑ k ≥ m { k m } g ( k ) ⟺ g ( m ) = ∑ k ≥ m ( − 1 ) k − m [ k m ] f ( k ) f ( m ) = ∑ k ≥ m { k m } g ( k ) ⟺ g ( m ) = ∑ k ≥ m ( − 1 ) k − m [ k m ] f ( k )
证明(感谢 qwaszx 指点)
来类比这里的证明 ,普通幂和斯特林数不是很搭,用下降幂来解决。
∑ m ≥ 0 f ( m ) z m – – = ∑ m ≥ 0 ∑ k ≥ m { k m } g ( k ) z m – – = ∑ k ≥ 0 g ( k ) ∑ m ≤ k { k m } z m – – = ∑ k ≥ 0 g ( k ) z k ∑ m ≥ 0 f ( m ) z m _ = ∑ m ≥ 0 ∑ k ≥ m { k m } g ( k ) z m _ = ∑ k ≥ 0 g ( k ) ∑ m ≤ k { k m } z m _ = ∑ k ≥ 0 g ( k ) z k
直接两边提取 [ z k ] [ z k ] ,那么左侧要计算 f ( m ) f ( m ) 的贡献系数是 [ z k ] z m – – = [ m k ] ( − 1 ) m − k [ z k ] z m _ = [ m k ] ( − 1 ) m − k (下降幂转普通幂),于是就完成了证明。每一步都是当且仅当所以逆命题也成立。
恒等式
具体数学 P221。
(6.15) 组合意义 ( n k ) ( n k ) 是把 n + 1 n + 1 所在的集合给选出来;(6.16) 归纳不是很难(这个怎么组合意义啊?);(6.17) 和 (6.18) 是 (6.15) 和 (6.16) 二项式反演得到的。
upd:感谢鱼鱼教我 (6.16) 的简洁证明:
n ∑ k = 0 [ n k ] ( k m ) = [ x m ] n ∑ k = 0 { n k } ( 1 + x ) k = [ x m ] ( 1 + x ) ¯ ¯ ¯ n = [ x m ] 1 x x ¯ ¯¯¯¯¯¯¯¯ ¯ n + 1 = [ n + 1 m + 1 ] ∑ k = 0 n [ n k ] ( k m ) = [ x m ] ∑ k = 0 n { n k } ( 1 + x ) k = [ x m ] ( 1 + x ) n ¯ = [ x m ] 1 x x n + 1 ¯ = [ n + 1 m + 1 ]
(6.19) 就是同一行第二类斯特林数那个式子,另一个推法是对 m n = ∑ k ( m k ) { n k } k ! m n = ∑ k ( m k ) { n k } k ! 二项式反演,这个式子是 n n 个不同球放进 m m 个可空盒子方案数,右侧是枚举非空盒子个数。
(6.20) 组合意义,考虑哪个盒子中最小编号球最大,枚举这个球是哪个,对于前面的直接 { k m } { k m } 分出来 m m 个盒子,对于后面 n − k n − k 个球每个球都有 m + 1 m + 1 个盒子可以选择放进去。(6.21) 也一样,后面 n − k n − k 个球放入的方案数从左到右分别是 k + 1 , k + 2 ⋯ n k + 1 , k + 2 ⋯ n ,乘起来就是 n n − k – ––– – n n − k _ .
(6.22) (6.23):回想对二项式系数斜线求和是怎么处理的,那么这里也一样,将 { n + 0 0 } { n + 0 0 } 看成 { n + 1 0 } { n + 1 0 } 然后一层层合并,(6.23) 也一样。
/fn 后面的不想看了开摆
互不相等容斥
老题新做一下 TopCoder 13444 CountTables 。广为人知的做法是 f i f i 表示 n × i n × i 矩阵每行 互不相同的个数,g i g i 是每行每列 互不相同的个数。将每一列看成一个元素,那么将 f i f i 中的相等元素合并起来就得到了一个 g j g j ,所以 f i = ∑ j ≤ i { i j } g j f i = ∑ j ≤ i { i j } g j ,而 f i = ( c i ) n – – f i = ( c i ) n _ 从而可以利用斯特林反演计算出 g m g m 的值。
还是想用常规的容斥思路 来算。现在问题是有 n n 个元素 a 1 , a 2 , ⋯ a n a 1 , a 2 , ⋯ a n ,每个元素都有若干取值可以取,计算满足 a a 两两不同的方案数。那么限制就是 ∏ i < j [ a i ≠ a j ] ∏ i < j [ a i ≠ a j ] ,写成 ∏ i < j ( 1 − [ a i = a j ] ) ∏ i < j ( 1 − [ a i = a j ] ) 后将其展开,每个括号取 1 1 或者 − [ a i = a j ] − [ a i = a j ] ,那么相等关系就会连成若干个连通块,一条边连起来表示这个括号取了 − [ a i = a j ] − [ a i = a j ] ,没连表示取 1 1 .
把每个连通块看成一个点的集合,现在对于 1 ∼ n 1 ∼ n 的一个集合划分计算容斥系数和,其等于各个连通块容斥系数和的乘积。那么现在要计算的就是对于这个连通块内部的边,有多少边集 E E 能够将所有点连通,并且带来 ( − 1 ) | E | ( − 1 ) | E | 容斥系数的贡献。
用总的贡献减去不合法的贡献。假设现在有 k k 个点,取边 ( 1 , 2 ) ( 1 , 2 ) ,对于任意一个方案而言将其存在状态取反即得到另一个边个数奇偶性不同的方案,这是一个双射,两个方案权值相反可以抵消。仅有 k = 1 k = 1 的时候选不出一条边,所以总的贡献和是 [ k = 1 ] [ k = 1 ] .
假设 f i f i 表示 i i 个点的答案,计算不合法贡献就枚举 i i 所在连通块是哪些点,那么就有 f i = [ i = 1 ] − ∑ 1 ≤ j ≤ i − 1 ( i − 1 j − 1 ) f j [ i − j = 1 ] f i = [ i = 1 ] − ∑ 1 ≤ j ≤ i − 1 ( i − 1 j − 1 ) f j [ i − j = 1 ] ,所以 i > 1 i > 1 时就有 f i = ( − 1 ) ( i − 1 ) f i − 1 f i = ( − 1 ) ( i − 1 ) f i − 1 ,那么 f k = ( − 1 ) k − 1 ( k − 1 ) ! f k = ( − 1 ) k − 1 ( k − 1 ) ! .
假如枚举了一个集合划分 { S 1 , S 2 , ⋯ , S k } { S 1 , S 2 , ⋯ , S k } ,那么所有能得到这个集合划分的钦定方案的容斥系数的和就是 ∏ ( − 1 ) | S i | − 1 ( | S i | − 1 ) ! ∏ ( − 1 ) | S i | − 1 ( | S i | − 1 ) ! .
注意到 ( | S i | − 1 ) ! ( | S i | − 1 ) ! 就是环排列方案数,而 ( − 1 ) | S | − 1 ( − 1 ) | S | − 1 看成初始有 ( − 1 ) n ( − 1 ) n 每多一个 S S 就乘一个 ( − 1 ) ( − 1 ) ,所以它其实和斯特林反演是等价的。
欧拉数
欧拉数:恰好满足有 k k 个升高的排列 π 1 π 2 ⋯ π n π 1 π 2 ⋯ π n 的个数。其中升高定义为 π i < π i + 1 π i < π i + 1 的 i i 的个数,记做 ⟨ n k ⟩ ⟨ n k ⟩ ,考虑将 n n 往 ( n − 1 ) ( n − 1 ) 的排列中插入可得递推式:⟨ n k ⟩ = ( k + 1 ) ⟨ n − 1 k ⟩ + ( n − k ) ⟨ n − 1 k − 1 ⟩ ⟨ n k ⟩ = ( k + 1 ) ⟨ n − 1 k ⟩ + ( n − k ) ⟨ n − 1 k − 1 ⟩ .
回想起不等关系 ,尝试用容斥去算欧拉数 ⟨ n m ⟩ ⟨ n m ⟩ 。假定钦定了若干个间隔是 <
,它们一共形成了 k k 个极长连续上升段,那么一共钦定了 n − k n − k 个升高,根据二项式反演其容斥系数为 ( − 1 ) n − k − m ( n − k m ) ( − 1 ) n − k − m ( n − k m ) ,而考虑每个极长连续段看成一个盒子,那么方案数就是将 n n 个球放进 k k 个盒子中,并且盒子之间有顺序(由于每个段必须要求上升所以不需要考虑球之间的顺序),那么方案数是 { n k } k ! { n k } k ! ,至此得到了 (6.40):
⟨ n m ⟩ = ∑ k { n k } ( n − k m ) ( − 1 ) n − k − m k ! (6.40) (6.40) ⟨ n m ⟩ = ∑ k { n k } ( n − k m ) ( − 1 ) n − k − m k !
而 (6.39) 即为 (6.40) 逆用二项式反演得到的结果,在 (6.40) 中令 k ← n − k k ← n − k 换元即可看出 f ( i ) = ⟨ n i ⟩ , g ( i ) = { n n − i } ( n − i ) ! f ( i ) = ⟨ n i ⟩ , g ( i ) = { n n − i } ( n − i ) ! ,f ( m ) = ∑ k ≥ m ( k m ) ( − 1 ) k − m g ( k ) f ( m ) = ∑ k ≥ m ( k m ) ( − 1 ) k − m g ( k ) 从而导出 g ( m ) = ∑ k ≥ m ( k m ) f ( k ) g ( m ) = ∑ k ≥ m ( k m ) f ( k ) ,再换元 m ≤ n − m m ≤ n − m 就得到了 (6.39).
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?