终于解出了dm同窗的难题,dm同窗赞成帮v神联络。可dm同窗有个习惯,就是联络同窗的时候喜欢分组联络,并且分组的方式也很特别,要求第i组的的人数必须大于他指定的个数ci。在dm同窗联络的时候,v神在想,按照dm同窗的规则一共能够有多少种方案呢?他想啊想,终于……没想出来。因而他又想到了聪明的你,你能帮v神算出按照dm同窗的规则有多少种分组方案吗?spa
v神的班级共有n我的,dm同窗想把同窗分红M组联络,要求第i组的人数必须大于给定的正整数Ci,求有多少不一样的方案?(两个是相同的方案当且仅当对于任意的一队i,两个方案的第i组同窗数量相等)因为结果很大,因此你只须要输出模1000000007的值。code
输入格式:blog
第一行两个整数N和M ,后面有M行,每行一个整数,表示Cici
输出格式:get
仅有一行,一个整数,方案数模1000000007的值。io
样例解释:class
方案有三种,每组的个数分别是(3,3,4),(2,4,4),(2,3,5)。gc
数据范围约定:数据
对于30%的数据,N ,M<= 10di
对于60%的数据,N ,M<=1000
对于100%的数据,N ,M<= 1000000 Ci<=1000
数据保证至少有一个方案
能够将题目看做,有 n- sigmaCi 我的,每一个人去一个小组里,并要求每一个小组至少有一人,
那么方案数即为 C(n-sigmaCi-1,m-1)
1 #include <cstdio> 2 3 #define LL long long 4 5 inline void read(int &x) 6 { 7 x=0; register char ch=getchar(); 8 for(; ch>'9'||ch<'0'; ) ch=getchar(); 9 for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0'; 10 } 11 12 const int P(1000000007); 13 14 LL fac[1000005]; 15 16 inline LL Pow(LL a,LL b) 17 { 18 LL ret=1; 19 for(; b; b>>=1,a*=a,a%=P) 20 if(b&1) ret=1ll*ret*a,ret%=P; 21 return ret; 22 } 23 24 inline LL C(LL n,LL m) 25 { 26 fac[0]=1; 27 for(int i=1; i<=n; ++i) 28 fac[i]=1ll*fac[i-1]*i%P; 29 return 1ll*fac[n]*Pow(fac[m],P-2)%P*Pow(fac[n-m],P-2)%P; 30 } 31 32 int Presist() 33 { 34 int n,m; 35 read(n),read(m); 36 for(int x,i=1; i<=m; ++i) 37 read(x), n-=x; 38 printf("%I64d\n",C(n-1,m-1)); 39 return 0; 40 } 41 42 int Aptal=Presist(); 43 int main(int argc,char**argv){;}