bzoj4710 [Jsoi2011]分特产 容斥原理

来源:互联网 发布:爱喝啤酒软件 编辑:程序博客网 时间:2024/06/10 13:44

首先知道隔板法可以算出有空的方案。
那么就可以把题目转化为总方案书-不合法的方案数,容斥以后即:
至少0个人为空-至少一个人为空+至少。。。。。
那么强制不选i个盒子,算出方案数以后就是只有n-i个人有的方案。
但是并不能确定是哪i个人没被分配,所以最后乘上一个C(n,i)

#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=2e3+5;const int mo=1e9+7;typedef long long ll;int c[N][N];int a[N],n,m;ll ans;int main(){    scanf("%d%d",&n,&m);    fo(i,1,m)scanf("%d",&a[i]);    fo(i,0,2000)c[i][0]=1;    fo(i,1,N-5)    fo(j,1,N-5)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mo;    int f=1;    fo(i,0,n)    {        ll tmp=1;        fo(j,1,m)        tmp=tmp*c[a[j]+n-i-1][n-i-1]%mo;        ans=(ans+tmp*c[n][i]%mo*f)%mo;        f=-f;       }    if (ans<0)ans=(ans+mo)%mo;    printf("%lld\n",ans%mo);}