题面

JSOI2011 分特产

有 \(n\) 个不同的盒子和 \(m\) 种不同的球,第 \(i\) 种球有 \(a_i\) 个,用光所有球,求使每个盒子不空的方案数。

数据范围:\(1\le n,m,a_i\le 1000\)。


蒟蒻语

今天做了几道黑题,蒟蒻的做法非常蒟蒻,看上去很厉害其实很废,巨佬的做法是容斥,秒杀一切。

所以蒟蒻拿这道水题讲讲自己的做法。希望巨佬教蒟蒻容斥 \(\tt /kel\)。


蒟蒻解

看到盒子不能空,先二项式反演。

\(f(i)\) 表示 \(i\) 个盒子空,剩下非空的方案数;\(g(i)\) 表示 \(i\) 个盒子空,剩下随意。

\[g(i)=\sum_{x=i}^n {x\choose i}f(x)\Longleftrightarrow f(i)=\sum_{x=i}^n{x\choose i}(-1)^{x-i}g(x)
\]

然后考虑 \(g(i)\) 怎么求:因为 \(n-i\) 个可以空可以不空,所以可以构造生成函数:

\[\left(\prod_{j=1}^m(1+x_j+x_j^2+x_j^3+\cdots)\right)^{n-i}
\]

\(g(i)\) 就等于 \(\prod_{j=1}^mx_j^{a_j}\) 的项数。

所以可以每个 \(x_j\) 分开来考虑,用隔板法,得出:

\[g(i)={n\choose i}\prod_{j=1}^m{a_j+n-i-1\choose n-i-1}
\]

然后答案就是(当 \(x=n\) 时 \(n-x-1=-1\),所以结果为 \(0\),不需要枚举):

\[f(0)=\sum_{x=0}^{n-1}(-1)^{x}{n\choose x}\prod_{j=1}^m{a_j+n-x-1\choose n-x-1}
\]

代码

跟巨佬的代码是一样的,只不过推导过程不同。

#include <bits/stdc++.h>
using namespace std; //Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define be(a) a.begin()
#define en(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f; //Data
const int N=1e3,T=N<<1;
const int mod=1e9+7;
int n,m,a[N],c[T+1][T+1];
int g(int x){
int res=c[n][x];
for(int i=0;i<m;i++)
res=(ll)res*c[a[i]+n-x-1][n-x-1]%mod;
return res;
} //Main
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=0;i<=T;i++){
c[i][0]=c[i][i]=1;
for(int j=1;j<=i-1;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
for(int i=0;i<m;i++) cin>>a[i];
int ans=0;
for(int i=0;i<n;i++){
if(i&1) (ans+=mod-g(i))%=mod;
else (ans+=g(i))%=mod;
}
cout<<ans<<'\n';
return 0;
}

祝大家学习愉快!

题解-JSOI2011 分特产的更多相关文章

  1. 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

    [BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...

  2. BZOJ 4710: [Jsoi2011]分特产 [容斥原理]

    4710: [Jsoi2011]分特产 题意:m种物品分给n个同学,每个同学至少有一个物品,求方案数 对于每种物品是独立的,就是分成n组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...

  3. bzoj4710: [Jsoi2011]分特产 组合+容斥

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 289  Solved: 198[Submit][Status] ...

  4. bzoj4710 [Jsoi2011]分特产(容斥)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 814  Solved: 527[Submit][Status] ...

  5. 4710: [Jsoi2011]分特产

    4710: [Jsoi2011]分特产 链接 分析: 容斥原理+隔板法. 代码: #include<cstdio> #include<algorithm> #include&l ...

  6. 【BZOJ 4710】 4710: [Jsoi2011]分特产 (容斥原理)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 99  Solved: 65 Description JYY 带 ...

  7. [BZOJ4710][JSOI2011]分特产(组合数+容斥原理)

    4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 262[Submit][Status] ...

  8. BZOJ 4710 [Jsoi2011]分特产 解题报告

    4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同.将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方 ...

  9. ●BZOJ 4710 [Jsoi2011]分特产

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可 ...

随机推荐

  1. c++ priority_queue应用(重要)

    自定义排序 重写仿函数 struct cmp{ bool operator() ( Node a, Node b ){//默认是less函数 //返回true时,a的优先级低于b的优先级(a排在b的后 ...

  2. uboot分析——makefile

    1.makefile分析 $(TOPDIR)/makefile | |-----> include $(obj)/include/config.mk  确定板子环境 | || | V |---- ...

  3. simple-rpc

    RPC的实现原理 正如上一讲所说,RPC主要是为了解决的两个问题: 解决分布式系统中,服务之间的调用问题. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑. 还是以计算器Calc ...

  4. ASP.NET Core 3 起架设在 Windows IIS 方式改变

    最近要升级 windows 服务器的 ASP.NET Core 2.1 专案到 3.1 版本,发现 Windows 架设在 IIS 上面的方式有所改变. 一. 除了反向代理外,从 ASP.NET Co ...

  5. 面试官:小伙子,给我说一下spring框架吧

    1. spring是什么 轻量级开源框架 以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核. 还能整 ...

  6. jQuery 小demo 热点排名

    效果如下: 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta cha ...

  7. python中正则表达式

    正则表达式是一种通用的字符串匹配技术,是不会因为编程语言不一样而发生变化的如果想查找对应规则的字符串,就可以用正则表达式python中要使用正则表达式需使用re模块,它是正则表达式在python中的封 ...

  8. 【mq读书笔记】客户端处理消息(回调提交到异步业务线程池,pullRequest重新入队)

    看一下客户端收到消息后的处理: MQClientAPIImpl#processPullResponse private PullResult processPullResponse( final Re ...

  9. Visual Studio 调试技巧之即时窗口的妙用

    在 Visual Studio 中有一个窗口叫 Immediate 窗口,中文版本应该叫即时窗口.默认会在你启动调试时在 VS 编辑器中弹出来.你也可以通过 Debug | Windows | Imm ...

  10. 面经手册 · 第20篇《Thread 线程,状态转换、方法使用、原理分析》

    作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...