多重集下的组合数

多重集定义

多重集是指包含重复元素的广义集合
例如 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , . . . , n k ⋅ a k } S=\{n_1\cdot a_1,n_2\cdot a_2,...,n_k\cdot a_k\} S={n1a1,n2a2,...,nkak}就是由 n 1 n_1 n1 a 1 a_1 a1 n 2 n_2 n2 a 2 a_2 a2,…, n k n_k nk a k a_k ak组成的多重集


多重集的排列数

给定一个多重集 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , . . . , n k ⋅ a k } S=\{n_1\cdot a_1,n_2\cdot a_2,...,n_k\cdot a_k\} S={n1a1,n2a2,...,nkak}
其排列数为
A = N ! n 1 ! n 2 ! . . . n k ! , ( N = ∑ i = 1 k n i ) A=\frac{N!}{n_1!n_2!...n_k!},(N=\sum_{i=1}^kn_i) A=n1!n2!...nk!N!,(N=i=1kni)


多重集的组合数

(Q1)
给定一个多重集 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , . . . , n k ⋅ a k } S=\{n_1\cdot a_1,n_2\cdot a_2,...,n_k\cdot a_k\} S={n1a1,n2a2,...,nkak}
以及一个整数 m m m,且有 m < = n i ( ∀ i ∈ [ 1 , k ] ) m<=n_i(\forall i\in[1,k]) m<=ni(i[1,k])
求从S中取出任意m个元素可以产生的不同多重集数量
(A1)
a n s = C k + m − 1 k − 1 ans=C_{k+m-1}^{k-1} ans=Ck+m1k1

证明
题目所求就是满足 ∑ i = 1 k x i = m \sum_{i=1}^kx_i=m i=1kxi=m的多重集 { x 1 ⋅ a 1 , x 2 ⋅ a 2 , . . . , x k ⋅ a k } \{x_1\cdot a_1,x_2\cdot a_2,...,x_k\cdot a_k\} {x1a1,x2a2,...,xkak}的数量
换句话说
就是就是要给每个 x i x_i xi赋值 [ 0 , m ] [0,m] [0,m]中的任意整数,且所有 x i x_i xi的和为m
(这里因为有 m < = n i ( ∀ i ∈ [ 1 , k ] ) m<=n_i(\forall i\in[1,k]) m<=ni(i[1,k]),所以不用考虑 x i > n i x_i>n_i xi>ni的情况)

若我们用0的个数表示每个 x i x_i xi的值
那么我们可以转化原问题为
k − 1 k-1 k1 1 1 1 m m m 0 0 0分为 k k k组的方案数
也就是多重集 { m ⋅ 0 , ( k − 1 ) ⋅ 1 } \{m\cdot 0,(k-1)\cdot 1\} {m0,(k1)1}排列数
故得
a n s = ( m + k − 1 ) ! m ! ( k − 1 ) ! = C k + m − 1 m = C k + m − 1 k − 1 ans=\frac{(m+k-1)!}{m!(k-1)!}=C_{k+m-1}^{m}=C_{k+m-1}^{k-1} ans=m!(k1)!(m+k1)!=Ck+m1m=Ck+m1k1


(Q2)
给定一个多重集 S = { n 1 ⋅ a 1 , n 2 ⋅ a 2 , . . . , n k ⋅ a k } S=\{n_1\cdot a_1,n_2\cdot a_2,...,n_k\cdot a_k\} S={n1a1,n2a2,...,nkak}
以及一个整数 m ( m < = ∑ i = 1 k n i m(m<=\sum_{i=1}^kn_i m(m<=i=1kni)
求从S中取出任意m个元素可以产生的不同多重集数量
(A2)
a n s = C k + m − 1 k − 1 − ∑ i = 1 k C k + m − n i − 2 k − 1 + ∑ 1 < = i , j < = k , i ! = j C k + m − n i − n j − 3 k − 1 − . . . + ( − 1 ) k C k + m − ∑ i = 1 k n i − ( k + 1 ) k − 1 ans=C_{k+m-1}^{k-1}-\sum_{i=1}^kC_{k+m-n_i-2}^{k-1}+\sum_{1<=i,j<=k,i!=j}C_{k+m-n_i-n_j-3}^{k-1}-...+(-1)^kC_{k+m-\sum_{i=1}^{k}n_i-(k+1)}^{k-1} ans=Ck+m1k1i=1kCk+mni2k1+1<=i,j<=k,i!=jCk+mninj3k1...+(1)kCk+mi=1kni(k+1)k1

证明
上面的式子显然用到了容斥定理
怎么理解呢

先不考虑 n i n_i ni得限制
那么从其中取m个元素的方案数为 C k + m − 1 k − 1 C_{k+m-1}^{k-1} Ck+m1k1

这里的方案数显然包含了 x i > n i x_i>n_i xi>ni的不合法方案
S i S_i Si表示至少包含 n i + 1 n_i+1 ni+1 a i a_i ai的多重集(也就是 a i a_i ai个数不合法的多重集)
我们需要从上述总方案数中减去 S i S_i Si的数量

怎么求 S i S_i Si的数量呢
我们先 S S S中取出 n i + 1 n_i+1 ni+1 a i a_i ai
再在 S S S任选 m − n i − 1 m-n_i-1 mni1个元素
即构成了 S i S_i Si
根据Q1证明可得其数量为 C k + m − n i − 2 k − 1 C_{k+m-n_i-2}^{k-1} Ck+mni2k1

减去了所有只考虑 x i > n i x_i>n_i xi>ni的不合法方案后
会发现我们还多减去了 S i ⋂ S j S_i\bigcap S_j SiSj的数量
(也就是同时包含了至少 n i + 1 n_i+1 ni+1 a i a_i ai和至少 n j + 1 n_j+1 nj+1 a j a_j aj的多重集)
我们再把这部分数量加回来 ∑ 1 < = i , j < = k , i ! = j C k + m − n i − n j − 3 k − 1 \sum_{1<=i,j<=k,i!=j}C_{k+m-n_i-n_j-3}^{k-1} 1<=i,j<=k,i!=jCk+mninj3k1

反复容斥下去即可得到上述式子
a n s = C k + m − 1 k − 1 − ∑ i = 1 k C k + m − n i − 2 k − 1 + ∑ 1 < = i , j < = k , i ! = j C k + m − n i − n j − 3 k − 1 − . . . + ( − 1 ) k C k + m − ∑ i = 1 k n i − ( k + 1 ) k − 1 ans=C_{k+m-1}^{k-1}-\sum_{i=1}^kC_{k+m-n_i-2}^{k-1}+\sum_{1<=i,j<=k,i!=j}C_{k+m-n_i-n_j-3}^{k-1}-...+(-1)^kC_{k+m-\sum_{i=1}^{k}n_i-(k+1)}^{k-1} ans=Ck+m1k1i=1kCk+mni2k1+1<=i,j<=k,i!=jCk+mninj3k1...+(1)kCk+mi=1kni(k+1)k1


将上述推导实际应用
CodeForces - 451E Devu and Flowers【多重集下的组合数+容斥】题解

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值