4710 [Jsoi2011]分特产

题意

给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同。将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方案数。


先考虑两个简单的问题

给定\(m\)个相同元素和\(n\)个不同位置,每个位置至少分一个的方案数?

使用插板法,等价于在\(m-1\)个空挡里插\(n-1\)个元素,方案数为

\[\binom{m-1}{n-1}
\]

但是这样考虑,这个题目是做不了的。

给定\(m\)个相同元素和\(n\)个不同位置,每个位置可以不分的方案数?

事实上还是插板,但可以一个位置插两个板子。

把\(m\)个元素看做\(1\),把\(n-1\)个插开点看做\(0\),等价于从\(m+n-1\)个元素拿\(n-1\)个,方案数为

\[\binom{m+n-1}{n-1}
\]


从问题\(2\)出发,我们就可以容斥了

把一种方案有几个位置没选作为方案的性质,我们可以计算出一个至少有几个人没选的方案集合的数量。

因为位置的计算方法是等价的,所以我们不需要枚举子集,只需要简单的按照组合数进行计算就可以了。

具体的说,我们把所有集合的元素都独立按方案二的选出来,令\(f_i\)代表至少\(i\)个位置不选择元素的方案数,则有

\[f_i=\binom{n}{i}\prod\limits_{j=1}^n \binom{a_j+n-i-1}{n-i-1}
\]

则总方案是 至少\(0\)人-至少\(1\)人+...,即

\[\sum_{i=0}^{n-1}(-1)^if_i
\]


Code:

#include <cstdio>
#define ll long long
const int N=2000;
const ll mod=1e9+7;
ll C[N+10][N+10];
void init()
{
C[0][0]=1;
for(int i=1;i<=N;i++)
{
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
}
int n,m,a[N];ll ans;
int main()
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d",a+i);
for(int i=0;i<n;i++)
{
ll mu=1;
for(int j=1;j<=m;j++)
(mu*=C[a[j]+n-i-1][n-i-1])%=mod;
(ans+=(i&1?-1ll:1ll)*C[n][i]*mu%mod)%=mod;
}
printf("%lld\n",(ans%mod+mod)%mod);
return 0;
}

2018.10.18

最新文章

  1. 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)
  2. .Net程序员面试所需要的一些技术准备
  3. c#内部类的使用
  4. [WinApi] C#获取其他窗口文本框内容(转)
  5. mvc4 分离Controller 出现 未找到路径“/”的控制器或该控制器未实现 IController
  6. 【腾讯Bugly干货分享】从0到1打造直播 App
  7. c/c++ 指针理解(1)
  8. Selenium2+python自动化13-多窗口、句柄(handle)
  9. 【状态模式】 State Pattern
  10. 和小猪一起搞微信公众号开发—获取Access_token
  11. oracle口令管理之允许某个用户最多尝试三次登录
  12. jQuery ajaxForm和 ajaxSubmit注意
  13. [转]Ubuntu18.04下使用Docker Registry快速搭建私有镜像仓库
  14. 斯坦福大学公开课机器学习: advice for applying machine learning | deciding what to try next(revisited)(针对高偏差、高方差问题的解决方法以及隐藏层数的选择)
  15. Mysql清空表(truncate)与删除表中数据(delete)的区别
  16. 使用android快速开发框架afinal的FinalDb操作android数据库
  17. 使用DevExpress Reports和PDF Viewer创建AcroForm Designer
  18. 插入数据时候获取返回的id 很重要 不要忘记写select last_insert_id()
  19. -webkit-transition -moz-transition transition
  20. js原生态函数中使用jQuery中的 $(this)无效的解决方法

热门文章

  1. Hadoop(19)-MapReduce框架原理-Combiner合并
  2. CentOS下安装pip
  3. 谭浩强C语言第四版第九章课后习题7--9题(建立,输出,删除,插入链表处理)
  4. 005---Python数据类型--字典
  5. Java——equals方法---18.10.18
  6. Ubuntu无法安装vim怎么办?(Ubuntu 出现apt-get: Package has no installation candidate问题)
  7. 在WPF中自定义控件(3) CustomControl (下)
  8. laravel读excel
  9. JAXB轻松转换xml对象和java对象
  10. java堆内存模型