2019.02.09 bzoj4710: [Jsoi2011]分特产(容斥原理)
传送门
题意简述:有nnn个人,mmm种物品,给出每种物品的数量aia_iai,问每个人至少分得一个物品的方案数(n,m,每种物品数≤1000n,m,每种物品数\le1000n,m,每种物品数≤1000)。
思路:
我们算出fif_ifi表示至少有iii个人没有分到物品的方案数容斥一下即可。
于是fi=Cni∏j=1mCn−i−1+ajn−i−1f_i=C_n^i\prod_{j=1}^mC_{n-i-1+a_j}^{n-i-1}fi=Cni∏j=1mCn−i−1+ajn−i−1
前面的组合数指的是选出没有分到物品的iii个人,后面的指对于每一种物品分给剩下的n−in-in−i个人的方案数。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
const int N=2005,mod=1e9+7,mod1=1e9+6;
int ans=0,fac[N],ifac[N],n,m,a[N];
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
inline int C(int n,int m){return mul(mul(fac[n],ifac[m]),ifac[n-m]);}
inline void init(){
fac[0]=ifac[0]=fac[1]=ifac[1]=1;
for(ri i=2;i<=2000;++i)fac[i]=mul(fac[i-1],i),ifac[i]=mul(ifac[mod-mod/i*i],mod-mod/i);
for(ri i=2;i<=2000;++i)ifac[i]=mul(ifac[i],ifac[i-1]);
}
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int main(){
n=read(),m=read(),init();
for(ri i=1;i<=m;++i)a[i]=read();
for(ri tmp,i=0;i<=n;++i){
tmp=C(n,i);
for(ri j=1;j<=m;++j)tmp=mul(tmp,C(n-i-1+a[j],n-i-1));
ans=i&1?dec(ans,tmp):add(ans,tmp);
}
cout<<ans;
return 0;
}
2019.02.09 bzoj4710: [Jsoi2011]分特产(容斥原理)的更多相关文章
- [BZOJ4710][JSOI2011]分特产(组合数+容斥原理)
4710: [Jsoi2011]分特产 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 395 Solved: 262[Submit][Status] ...
- bzoj4710 [Jsoi2011]分特产(容斥)
4710: [Jsoi2011]分特产 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 814 Solved: 527[Submit][Status] ...
- BZOJ 4710: [Jsoi2011]分特产 [容斥原理]
4710: [Jsoi2011]分特产 题意:m种物品分给n个同学,每个同学至少有一个物品,求方案数 对于每种物品是独立的,就是分成n组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...
- bzoj4710: [Jsoi2011]分特产 组合+容斥
4710: [Jsoi2011]分特产 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 289 Solved: 198[Submit][Status] ...
- 【bzoj4710】[Jsoi2011]分特产 容斥原理+组合数学
题目描述 JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因 ...
- BZOJ4710: [Jsoi2011]分特产 组合数学 容斥原理
题意:把M堆特产分给N个同学,要求每个同学至少分到一种特产,共有多少种分法? 把A个球分给B个人的分法种数:(插板法,假设A个球互不相同,依次插入,然后除以全排列去重) C(A,B+A) 把M堆特产分 ...
- BZOJ4710 JSOI2011分特产(容斥原理+组合数学)
显然可以容斥去掉每人都不为空的限制.每种物品分配方式独立,各自算一个可重组合乘起来即可. #include<iostream> #include<cstdio> #includ ...
- bzoj千题计划273:bzoj4710: [Jsoi2011]分特产
http://www.lydsy.com/JudgeOnline/problem.php?id=4710 答案=总方案数-不合法方案数 f[i][j] 前i种特产分给j个人(可能有人没有分到特产)的总 ...
- BZOJ4710: [Jsoi2011]分特产【组合数学+容斥】
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
随机推荐
- PAT1103
1103. Integer Factorization (30) 时间限制 1200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- RxJS之Subject主题 ( Angular环境 )
一 Subject主题 Subject是Observable的子类.- Subject是多播的,允许将值多播给多个观察者.普通的 Observable 是单播的. 在 Subject 的内部,subs ...
- Mac Sublime Text3 如何安装插件
1.打开sublime text3后按快捷键control+`后下面会出来东西,然后输入如下命令. import urllib.request,os; pf = 'Package Control.su ...
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- Java_4.1 猜数字游戏
猜数字游戏: 系统随机产生一个1-100之间的数字,用户输入一个数字,如果用户输入的数字和随机数一样,输出“恭喜,猜对了”:如果猜大了,输出“猜大了”:如果猜小了,就输出“猜小了”. 循环直到用户输入 ...
- Volley框架原理
Volley有如下优点: 1. 自动调度网络请求 2. 多并发请求 (源于开了多个线程)3. 本地Cache自动缓存网络请求结果 4. 支持设置请求优先级 5. 支持取消单个请求或者取消所有请求 6. ...
- Bootstrap(5)栅格系统
一.移动设备优先 在 HTML5 的项目中,我们做了移动端的项目.它有一份非常重要的 meta,用于设置屏幕和设备等宽以及是否运行用户缩放,及缩放比例的问题. //分别为:屏幕宽度和设备一致.初始缩放 ...
- 移动端页面返回,数据不刷新bug解决
一,当安卓和ios都有问题的时候 // a.html 设置刷新 检测缓存是否有标志 要是有就说明数据有变化 a.html跳转到b.html页面 window.addEventListener(&quo ...
- git 标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...
- 用上了Godaddy的美国主机
最近把两个域名转移到Godaddy上面后,就不停地收到它的促销邮件,送一些优惠码打折. 昨天通过它的优惠链接买了一个豪华型空间,支持无限空间,无限域名绑定. 看着邮件上写的是打半折,同时还免费送一个域 ...