洛谷—— P1680 奇怪的分組

https://www.luogu.org/problemnew/show/1680

題目背景

終於解出了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

 

輸入輸出樣例

輸入樣例#1:  複製
10 3
1
2
3
輸出樣例#1:  複製
3

說明

樣例解釋: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){;}
相關文章
相關標籤/搜索