【题解】「JSOI 2011」分特产

「JSOI 2011」分特产

【题目描述】

J Y Y JYY JYY 带队参加了若干场 ACM/ICPC \text{ACM/ICPC} ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们。

J Y Y JYY JYY 想知道,把这些特产分给 n n n 个同学,一共有多少种不同的分法?当然, J Y Y JYY JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产。

例如, J Y Y JYY JYY 带来了 2 2 2 袋麻花和 1 1 1 袋包子,分给 A A A B B B 两位同学,那么共有 4 4 4 种不同的

分配方法:

A A A:麻花, B B B:麻花、包子

A A A:麻花、麻花, B B B:包子

A A A:包子, B B B:麻花、麻花

A A A:麻花、包子, B B B:麻花

【输入格式】

输入数据:第一行是同学的数量 n n n 和特产的数量 m m m

第二行包含 M M M 个整数,表示每一种特产的数量。

N , M N,M N,M 不超过 1000 1000 1000 ,每一种特产的数量不超过 1000 1000 1000

【输出格式】

输出一行,不同分配方案的总数。

由于输出结果可能非常巨大,你只需要输出最终结果   m o d   1 0 9 + 7 \bmod {10^9+7} mod109+7 的数值就可以了。

【样例输入】

5 4
1 3 3 5

【样例输出】

384835

【算法分析】

先看一个简单的问题,有 m m m 个相同的小球,放到 n n n 个相同的盒子里,盒子不为空,问有多少种放置方案?

采用隔板法 m m m 个小球排成一排,在 m − 1 m-1 m1 个空隙中插入 n − 1 n-1 n1 块隔板,总共形成 n n n 个部分,每个部分就是一个盒子,总共有 C   m − 1   n − 1 C_{\ m-1}^{\ n-1} C m1 n1 种方案。

若盒子可以为空,问有多少种放置方案?

可以看做有 m + n m+n m+n 个元素,在 m + n − 1 m+n-1 m+n1 个空隙里插入 n − 1 n-1 n1 块隔板,总共形成 n n n 个部分,每个部分包含若干个元素,如果某部分只包含一个元素,则这个元素就看作盒子,且没有得到小球;若某部分包含 k k k 个元素,则这部分就看作 k − 1 k-1 k1 个小球放入 1 1 1 个盒子中。总共有 C   m + n − 1   n − 1 C_{\ m+n-1}^{\ n-1} C m+n1 n1 种方案。

对于本题,考虑一种特产一种特产的分,设第 j j j 种特产,有 a [ j ] a[j] a[j] 个,若有 i i i 个人没有得到特产,则剩下的 n − i n-i ni 个人分,且也可能某些人存在分不到的情况,方案数为 C   a [ j ] + n − i − 1   n − i − 1 C_{\ a[j]+n-i-1}^{\ n-i-1} C a[j]+ni1 ni1 ,同时,每个人编号不同,还需要选择 i i i 个人出来,这 i i i 个人肯定不能分到特产,所以至少 i i i 个人没有分到特产的方案数为: C n i × C a [ j ] + n − i − 1 n − i − 1 , 1 ≤ j ≤ m C_n^i\times C_{a[j]+n-i-1}^{n-i-1},1\le j\le m Cni×Ca[j]+ni1ni1,1jm ,一种特产一种特产的分,分步用乘法

f [ i ] f[i] f[i] 表示至少 i i i 个人没有分到特产的方案数, f [ i ] = C n i ∏ j = 1 m C   a [ j ] + n − i − 1   n − i − 1 f[i]=C_n^i\prod_{j=1}^m C_{\ a[j]+n-i-1}^{\ n-i-1} f[i]=Cnij=1mC a[j]+ni1 ni1

设有 3 3 3 个人分别是 A , B , C A,B,C A,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] 包含的情况: A B ( ) , A C ( ) , B C ( ) AB(),AC(),BC() AB(),AC(),BC(),这样就得到刚好 1 1 1 个人分不到、刚好 2 2 2 个人分不到的方案数,为 f [ 1 ] − f [ 2 ] f[1]-f[2] f[1]f[2]

根据容斥原理,那么刚好 1 1 1 个人、 2 2 2 个人、… n − 1 n-1 n1 个人的分不到的总的方案数为:

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] 表示至少 0 0 0 个人分不到的方案数,减去上面的方案数,就是刚好 0 0 0 个人分不到的方案数,即最后的答案: a n s = ∑ i = 0 n − 1 ( − 1 ) i × f [ i ] ans=\sum_{i=0}^{n-1}(-1)^i\times f[i] ans=i=0n1(1)i×f[i]

时间复杂度为 O ( N 2 ) O(N^2) O(N2)

【参考程序】


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值