【题解】分特产(组合数+容斥)

【题解】分特产(组合数+容斥)

一道小水题。

假如没有这个要求每个人都要有一个特产的限制我们直接可以组合数。

我们又发现人(本质上)是没有区别的,所以容斥的复杂度只有\(O(n)\)

\(n\)个人分\(m\)个特产,每个特产有\(a_i\)个,人可以不拿特产,的方案数就是把\(a_i\)分成\(n\)份,而且可以分为\(0\)份。

这个的答案就是
\[
f(n)=\prod_{i=1}^m {a_i+n-1\choose n-1}
\]
意思就是有\(a_i+n\)个球分成不为空\(n\)份的方案,新建\(n\)个球,选了这\(n\)个球代表你不选。

于是我们就可以容斥出来我们要的答案。
\[
\sum_{i=0}^{n-1} (-1)^if(n-i)
\]
哦要解释一下这个式子的意思,\(f(x)\)里面的方案数包括了所有大于\(x>\)它的的方案数。我们才要容斥。

所以枚举钦定至少\(i\)个人一个也没有,最终我们要的是0个人一个也没有。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long

using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}
const int mod=1e9+7;
const int maxn=2e3+5;
int jc[maxn];
int inv[maxn];
int data[maxn];
inline int Pow(int base,const int&p){
      register int ret=1;
      for(register int t=p;t;t>>=1,base=1ll*base*base%mod)
        if(t&1)ret=1ll*ret*base%mod;
      return ret;
}

inline int c(const int&n,const int&m){
      if(n<m||m<0)return 0;
      return 1ll*jc[n]*inv[m]%mod*1ll*inv[n-m]%mod;
}

signed main(){

      jc[0]=inv[0]=1;
      for(register int t=1;t<maxn;++t)
        jc[t]=1ll*jc[t-1]*t%mod,inv[t]=Pow(jc[t],mod-2);
      int n=qr(),m=qr();
      for(register int t=1;t<=m;++t)
        data[t]=qr();
      int ans=0;
      for(register int t=0,delta;t<n;++t){
        delta=c(n,t);
        for(register int i=1;i<=m;++i)
          delta=1ll*delta*c(data[i]+n-t-1,n-t-1)%mod;
        if(t&1)delta=mod-delta;
        ans=(ans+delta)%mod;
      }
      cout<<ans<<endl;
      return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/11017582.html

时间: 2024-10-30 05:42:17

【题解】分特产(组合数+容斥)的相关文章

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

[BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产. 例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的分配方法: A:麻花,B:麻花.包子 A:麻花.麻花,B:包子 A:包子,B:麻花.麻

bzoj4710 [Jsoi2011]分特产(容斥)

4710: [Jsoi2011]分特产 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 814  Solved: 527[Submit][Status][Discuss] Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任 何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产.

luogu 5505 [JSOI2011]分特产 广义容斥

code: #include <bits/stdc++.h> #define N 10005 #define LL long long using namespace std; const LL mod=1000000007; void setIO(string s) { string in=s+".in"; string out=s+".out"; freopen(in.c_str(),"r",stdin); } int a[N];

【题解】Gnutella Chessmaster(容斥+下降幂+二项式定理)

[题解]Gnutella Chessmaster(容斥+下降幂+二项式定理) Gnutella Chessmaster 绝世好题! 题目大意:有一个\(n\times n\)的棋盘,现在要在上面放\(k\)个Bishop,每个Bishop打两条对角线,问你放Bishop的方案数,方案不同当且仅当一个位置上存在主教的状态不同.你要对于每个k输出方案. prop1 对于这个棋盘二分图染色((1,1)=白),显然白色格子上面的Bishop打不到黑色格子上面的Bishop,于是我们可以分开算黑白格子的方

HAOI2018 [HAOI2018]染色 【组合数 + 容斥 + NTT】

题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只关心序列的 \(N\) 个位置中出现次数恰好为 \(S\) 的颜色种数, 如果恰 好出现了 \(S\) 次的颜色有 \(K\) 种, 则小 C 会产生 \(W_k\) 的愉悦度. 小 C 希望知道对于所有可能的染色方案, 他能获得的愉悦度的和对 1004535809 取模的结果是多少. 输入格式 从

【BZOJ2839】集合计数 组合数+容斥

[BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数,答案模1000000007.(是质数喔~) Input 一行两个整数N,K Output 一行为答案. Sample Input 3 2 Sample Output 6 HINT [样例说明]假设原集合为{A,B,C}则满足条件的方案为:{AB,ABC},{AC,ABC},{BC,ABC},{AB

【BZOJ3782】上学路线 组合数+容斥+CRT

[BZOJ3782]上学路线 Description 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的地,因此他每天上学时都只会向东或北行走:而小C又喜欢走不同的路径,因此他问你按照他走最短路径的规则,他可以选择的不同的上学路线有多少条.由于答案可能很大,所以小C只需要让你求出路径数mod P的值. Input 第一行,四个整数N.M.T.P. 接下来的T

Codeforces 100548F - Color (组合数+容斥)

题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选k种颜色有C(m, k)种方案,对于k种颜色方案为k*(k-1)^(n-1)种.但是C(m, k)*k*(k-1)^(n-1)方案包括了选k-1,k-2...,2种方案. 题目要求刚好k种颜色,所以这里想到用容斥. 但是要是直接C(m, k)*k*(k-1)^(n-1) - C(m, k-1)*(k

【BZOJ2339】[HNOI2011]卡农 组合数+容斥

[BZOJ2339][HNOI2011]卡农 题解:虽然集合具有无序性,但是为了方便,我们先考虑有序的情况,最后将答案除以m!即可. 考虑DP.如果我们已经知道了前m-1个集合,那么第m个集合已经是确定的了.因为内层集合的n个元素可以随便出现,那么总数就是A(2^n-1,m-1).但是可能存在不合法的情况. 1.在前m-1个集合中,n个数出现的次数已经都是偶数了,那么第m个集合为空,不合法,此时方案数为f[m-1].2.第m个集合与之前某个集合相同,那么我们不考虑这两个集合,剩下的方案数为f[i