定义
多重集是指可以包含重复元素的广义集合。
排列问题
现在你有一个形如
{a1×b1,a2×b2,...,ak×bk} 的多重集,其中
x×y 表示这个集合中有
x 个
y,现在问这个集合有多少种不同的排列方式。
这是一道很基础的组合数学问题。
我们先考虑这些元素有多少种排列方式,显然为:
(∑i=1kai)!。
但是我们还要去除相同的排列,我们注意到,这里面有
a1 个
b1,而这些
b1 之间交换位置是不会形成新的排列方式的,所以我们要除以
a1!,也就是这些
b1 之间的全排列方案数。
那么最后的答案就是:
a1!a2!...ak!(∑i=1kai)
组合问题
现在你有一个形如
S={a1×b1,a2×b2,...,ak×bk} 的多重集,现在要从中选出
m 个数,问有多少种方案。
Part 1
先考虑
m 满足
m≤ai (i∈[1,n]) 时的情况。
那么此时相当于没有了
ai 的限制,我们设
ci 表示
bi 这个数选
ci 个,那么需要满足
(∑i=1nci)=m 且对于任意
i,有
ci≥0。
那么现在问题等价于:有
k 个按顺序摆好的不同的盘子,你要将
m 个相同的苹果放到这
k 个盘子里,问方案数。
那么这就是一个经典的组合数插板法问题了(不会请戳这里),方案数为
Cm+k−1k−1=Cm+k−1m。
Part 2
在此基础上,我们再考虑
m 没有特殊性质时的情况。
不妨先忽略
ai 的影响,那么根据 Part 1 可以知道,此时的方案数为:
Cm+k−1m
但是我们还要减去不合法的方案,设
f[i] 表示
bi 这个数拿了至少
ai+1 个的方案数。
考虑求
f[i]:
bi 至少拿
ai+1 个的方案数,也就是先拿
ai+1 个
bi,然后再从剩下的里面拿
m−(ai+1) 个的方案数,也就是
f[i]=Cm+k−1−(ai+1)m−(ai+1)=Cm+k−1−(ai+1)k−1
那么答案就是:
Cm+k−1m−i=1∑kf[i]
还没完!
f[i] 之间计算的方案数是有重复的,比如说:对于
b1 拿了
a1+1 个,同时
b2 拿了
a2+1 个,这样的不合法方案会被
f[1] 和
f[2] 各计算一次,所以我们还需要加上
f[i]∩f[j] (i∈[1,n],j∈[1,n],i=j)。
f[i]∩f[j] 的计算方法类似上面,即
Cm+k−1−(ai+1)−(aj+1)k+1。
那么这样反复容斥下去,就能得到最终的答案:
ans=Cm+k−1m−i=1∑kCm+k−1−(ai+1)k−1+i∈[1,n],j∈[1,n],i=j∑Cm+k−1−(ai+1)−(aj+1)k−1+...+(−1)kp1∈[1,n],p2∈[1,n],⋯,p1=p2,p1=p3,⋯∑Cm+k−1−∑j=1k(pj+1)k−1
应用
Devu and Flowers 题解