Stirling数

第一类Stirling数: stir(n,k) s t i r ( n , k ) 表示 n n 个元素安排成k个轮换的方式数。
注意这里是 k k 个轮换,而不是k个子集。

轮换可以理解为循环排列,即认为

[A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C] [ A , B , C , D ] = [ B , C , D , A ] = [ C , D , A , B ] = [ D , A , B , C ]

前几项:
stir(0,0)=1 s t i r ( 0 , 0 ) = 1
stir(n,0)=0 s t i r ( n , 0 ) = 0 (n>=1) ( n >= 1 )
stir(1,1)=1 s t i r ( 1 , 1 ) = 1
stir(2,1)=1 s t i r ( 2 , 1 ) = 1
stir(2,2)=1 s t i r ( 2 , 2 ) = 1
….

递推:

stir(n,k)=(n1)stir(n1,k)+stir(n1,k1) s t i r ( n , k ) = ( n − 1 ) ∗ s t i r ( n − 1 , k ) + s t i r ( n − 1 , k − 1 )

对递推的理解:

k k 个轮换中,n个元素的每一种排列,要么把最后一个元素单独作为一个轮换(共有 stir(n1,k1) s t i r ( n − 1 , k − 1 ) 种方式),要么把这个元素插入前 n1 n − 1 个元素的 stir(n1,k) s t i r ( n − 1 , k ) 种轮换排列的一个中,共有 n1 n − 1 种不同方式插入。(如在轮换 [A,B,C] [ A , B , C ] 中插入新的元素 D D ,只能形成[A,B,C,D][A,B,D,C][A,D,B,C]这三种方式,没有别的可能性)


第二类Stirling数: stir2(n,k) s t i r 2 ( n , k ) 表示把 n n 个事物的集合划分为k个非空子集的方式数。

前几项:
stir2(0,0)=1 s t i r 2 ( 0 , 0 ) = 1
stir2(n,0)=0 s t i r 2 ( n , 0 ) = 0 (n>=1) ( n >= 1 )
stir2(1,1)=1 s t i r 2 ( 1 , 1 ) = 1

递推:

stir2(n,k)=kstir2(n1,k)+stir2(n1,k1) s t i r 2 ( n , k ) = k ∗ s t i r 2 ( n − 1 , k ) + s t i r 2 ( n − 1 , k − 1 )

对递推的理解:

n n 个元素分为k个非空部分,对于最后一个元素,要么单独放入一类(共有 stir2(n1,k1) s t i r 2 ( n − 1 , k − 1 ) 种方式),要么把它和前 n1 n − 1 个元素的某个非空子集放在一起。(共有 kstir2(n1,k) k ∗ s t i r 2 ( n − 1 , k ) 种方法)


几个例题:

HDU 3625

很显然的第一类Stirling数,关键在于对第一个房间的处理。

只有当第一个房间单独形成一个轮换的时候才必须破坏第一个房间的门,因此减去这些情况即可。

HDU 4372

按中间最高的房子把房子分开,左边有F-1个,右边有B-1个,可以看成先把最高的拿出来,剩下的N-1个形成F-1+B-1个轮换,再从这F+B-2个轮换中选F-1个放到左边去。

HDU 2643

n个人最少会有一种分数,最多会有n种分数,因此联想到第二类Stirling数,把n个人分成i类,再乘以i的全排列加起来就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值