終於解出了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){;}