枚举几个同学分到了
对于每种特产求一个方案数(经典做法)乘起来
然后容斥
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i) #define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i) #define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i) #define fi first #define se second #define pb push_back #define mp make_pair #define dbg(x) cerr<<#x" = "<<x<<endl #define debug(...) fprintf(stderr, __VA_ARGS__) #define Es(x,i) for(Edge *i=G[x];i;i=i->nxt) typedef long long ll; typedef pair<int,int> pii; const int inf=~0u>>1,mod=1e9+7; inline int rd() { int x,c,f=1;while(!isdigit(c=getchar()))f=c!=‘-‘;x=c-‘0‘; while(isdigit(c=getchar()))x=x*10+c-‘0‘;return f?x:-x; } inline int pw(int n,int m){int r=1;for(;m;m>>=1,n=(ll)n*n%mod)if(m&1)r=(ll)r*n%mod;return r;} const int N=1011,M=2*N; int fac[M],fai[M]; inline void init(){ fac[0]=1; For(i,1,M)fac[i]=(ll)fac[i-1]*i%mod; fai[M-1]=pw(fac[M-1],mod-2); per(i,1,M-1)fai[i-1]=(ll)fai[i]*i%mod; } inline int C(int n,int m){return n<m?0:(ll)fac[n]*fai[m]%mod*fai[n-m]%mod;} int m,n,a[N]; inline int Cal(int n){ int r=1; rep(i,1,m){ r=(ll)r*C(a[i]+n-1,n-1)%mod; } return r; } int main(){ #ifdef flukehn freopen("test.txt","r",stdin); #endif init(); //while(cin>>n>>m)cout<<C(n,m)<<endl; n=rd(),m=rd(); rep(i,1,m)a[i]=rd(); ll ans=Cal(n); For(i,1,n)ans+=((n-i&1)?-1:1)*(ll)Cal(i)*C(n,i)%mod; ans=(ans%mod+mod)%mod; cout<<ans<<endl; }