容斥原理是大学离散数学里的应用,就算没学过也能理解。毕竟,在程序员眼中,排列组合是不会有多么离散的。
题目
直接看题
Devu有N个盒子,第i个盒子中有Ai枝花。
同一个盒子内的花颜色相同,不同盒子内的花颜色不同。
Devu要从这些盒子中选出M枝花组成一束,求共有多少种方案。
若两束花每种颜色的花的数量都相同,则认为这两束花是相同的方案。
结果需对109+7取模之后方可输出。
输入格式
第一行包含两个整数N和M。
第二行包含N个空格隔开的整数,表示A1,A2,…,AN。
输出格式
输出一个整数,表示方案数量对109+7取模后的结果。
数据范围
1≤N≤20 ,
0≤M≤10^14,
0≤Ai≤10^12
输入样例:
3 5
1 3 2
输出样例:
3
题解
简化分析:
抽象题意,就是在求N个盒子中,有重复的选取M。。
是一道明显的有重复组合问题,但是这道题加了限制以此增加难度,同时数据量很大,M达到了10^14
下面看一下简化版。
假设,每个盒子中球的数量是无限的。
那么给如何求选取方案呢?
可以这样:
假设xi为第i个盒子中选出来的球。
那么满足等式:x1+x2+x3+....xi...+xn=M
(1)使用离散数学中有重复组合计数就直接得出答案,
(2)另一种思考模式,可以转化一下,求该等式解的数量,但是注意到xi可能为0,于是处理等式每个xi都加1,
x1+x2+x3+....xi...+xn=m+n
此时xi都为正整数,这就变得简单了。
使用隔板法,(在m+n-1个缝隙里放入N-1个隔板)
答案就是C(m+n-1,n-1);
简化就很舒服,但是回到现实,每个盒子里是有数量限制的。
这也很明显,我们使用排杂法
那怎么排杂呢?
我们需要满足的条件是x1<=A1,x2<=A2,x3<=A3……xn<=Anx1<=A1,x2<=A2,x3<=A3……xn<=An
我们只需要考虑理想情况C(m+n-1,n-1)再减去所有不合法的情况。
不合法的情况分为很多种,假设s1表示x1>A1的不合法情况,以此类推,si表示xi>Ai的不合法情况,那么很明显。主角登场,容斥原理。不合法就可以表示为s1⋃s2⋃s3……⋃sn的交集
注意,每一种组合就是该项不合法的所有情况,比如s1=C(M+N−1−(Ai+1),N−1)
那么结果

本文介绍了一种利用容斥原理解决有重复组合问题的方法,特别适用于处理大规模数据和高复杂度的问题,如从有限数量的盒子中选择特定数量的花的组合方案。通过分析和代码实现,展示了如何在考虑限制条件的情况下,高效地计算组合数量。
最低0.47元/天 解锁文章

293

被折叠的 条评论
为什么被折叠?



