「JSOI 2011」分特产
【题目描述】
JYYJYYJYY 带队参加了若干场 ACM/ICPC\text{ACM/ICPC}ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们。
JYYJYYJYY 想知道,把这些特产分给 nnn 个同学,一共有多少种不同的分法?当然,JYYJYYJYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产。
例如,JYYJYYJYY 带来了 222 袋麻花和 111 袋包子,分给 AAA 和 BBB 两位同学,那么共有 444 种不同的
分配方法:
AAA:麻花, BBB:麻花、包子
AAA:麻花、麻花, BBB:包子
AAA:包子, BBB:麻花、麻花
AAA:麻花、包子, BBB:麻花
【输入格式】
输入数据:第一行是同学的数量 nnn 和特产的数量 mmm。
第二行包含 MMM 个整数,表示每一种特产的数量。
N,MN,MN,M 不超过 100010001000 ,每一种特产的数量不超过 100010001000 。
【输出格式】
输出一行,不同分配方案的总数。
由于输出结果可能非常巨大,你只需要输出最终结果 mod 109+7\bmod {10^9+7}mod109+7 的数值就可以了。
【样例输入】
5 4
1 3 3 5
【样例输出】
384835
【算法分析】
先看一个简单的问题,有 mmm 个相同的小球,放到 nnn 个相同的盒子里,盒子不为空,问有多少种放置方案?
采用隔板法,mmm 个小球排成一排,在 m−1m-1m−1 个空隙中插入 n−1n-1n−1 块隔板,总共形成 nnn 个部分,每个部分就是一个盒子,总共有 C m−1 n−1C_{\ m-1}^{\ n-1}C m−1 n−1 种方案。
若盒子可以为空,问有多少种放置方案?
可以看做有 m+nm+nm+n 个元素,在 m+n−1m+n-1m+n−1 个空隙里插入 n−1n-1n−1 块隔板,总共形成 nnn 个部分,每个部分包含若干个元素,如果某部分只包含一个元素,则这个元素就看作盒子,且没有得到小球;若某部分包含 kkk 个元素,则这部分就看作 k−1k-1k−1 个小球放入 111 个盒子中。总共有 C m+n−1 n−1C_{\ m+n-1}^{\ n-1}C m+n−1 n−1 种方案。
对于本题,考虑一种特产一种特产的分,设第 jjj 种特产,有 a[j]a[j]a[j] 个,若有 iii 个人没有得到特产,则剩下的 n−in-in−i 个人分,且也可能某些人存在分不到的情况,方案数为 C a[j]+n−i−1 n−i−1C_{\ a[j]+n-i-1}^{\ n-i-1}C a[j]+n−i−1 n−i−1 ,同时,每个人编号不同,还需要选择 iii 个人出来,这 iii 个人肯定不能分到特产,所以至少 iii 个人没有分到特产的方案数为: Cni×Ca[j]+n−i−1n−i−1,1≤j≤mC_n^i\times C_{a[j]+n-i-1}^{n-i-1},1\le j\le mCni×Ca[j]+n−i−1n−i−1,1≤j≤m ,一种特产一种特产的分,分步用乘法。
设 f[i]f[i]f[i] 表示至少 iii 个人没有分到特产的方案数,f[i]=Cni∏j=1mC a[j]+n−i−1 n−i−1f[i]=C_n^i\prod_{j=1}^m C_{\ a[j]+n-i-1}^{\ n-i-1}f[i]=Cni∏j=1mC a[j]+n−i−1 n−i−1 。
设有 333 个人分别是 A,B,CA,B,CA,B,C,f[1]f[1]f[1] 包含的情况有,A(B,C)、B(A,C),C(A,B)A(B,C)、B(A,C),C(A,B)A(B,C)、B(A,C),C(A,B) ,括号外的表示选出来肯定分不到的人,括号里的表示可能分不到的人。可以发现,对于两人分不到的情况减了两次,因此需要加上 f[2]f[2]f[2] 包含的情况:AB(),AC(),BC()AB(),AC(),BC()AB(),AC(),BC(),这样就得到刚好 111 个人分不到、刚好 222 个人分不到的方案数,为 f[1]−f[2]f[1]-f[2]f[1]−f[2]。
根据容斥原理,那么刚好 111 个人、222 个人、… n−1n-1n−1 个人的分不到的总的方案数为:
f[1]−f[2]+f[3]−f[4]...f[1]-f[2]+f[3]-f[4]...f[1]−f[2]+f[3]−f[4]...
用 f[0]f[0]f[0] 表示至少 000 个人分不到的方案数,减去上面的方案数,就是刚好 000 个人分不到的方案数,即最后的答案:ans=∑i=0n−1(−1)i×f[i]ans=\sum_{i=0}^{n-1}(-1)^i\times f[i]ans=∑i=0n−1(−1)i×f[i] 。
时间复杂度为 O(N2)O(N^2)O(N2) 。
【参考程序】