【题解】「JSOI 2011」分特产

本文深入解析JSOI2011分特产问题,探讨如何将一定数量的特产平均分配给多个同学的不同方案,利用组合数学中的隔板法解决复杂问题,通过容斥原理计算精确答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

「JSOI 2011」分特产

【题目描述】

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

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

例如,JYYJYYJYY 带来了 222 袋麻花和 111 袋包子,分给 AAABBB 两位同学,那么共有 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-1m1 个空隙中插入 n−1n-1n1 块隔板,总共形成 nnn 个部分,每个部分就是一个盒子,总共有 C m−1 n−1C_{\ m-1}^{\ n-1}C m1 n1 种方案。

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

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

对于本题,考虑一种特产一种特产的分,设第 jjj 种特产,有 a[j]a[j]a[j] 个,若有 iii 个人没有得到特产,则剩下的 n−in-ini 个人分,且也可能某些人存在分不到的情况,方案数为 C a[j]+n−i−1 n−i−1C_{\ a[j]+n-i-1}^{\ n-i-1}C a[j]+ni1 ni1 ,同时,每个人编号不同,还需要选择 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]+ni1ni1,1jm ,一种特产一种特产的分,分步用乘法

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]=Cnij=1mC a[j]+ni1 ni1

设有 333 个人分别是 A,B,CA,B,CA,B,Cf[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-1n1 个人的分不到的总的方案数为:

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=0n1(1)i×f[i]

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

【参考程序】


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值