有 N ( 1 ≤ N ≤ 1 0 9 ) N(1≤N≤10^9) N(1≤N≤109)个不同的人,你从中选择 x x x( x x x至少为 1 1 1)个人去完成一个团队任务,代价为 x k ( 1 ≤ k ≤ 5000 ) x^k(1≤k≤5000) xk(1≤k≤5000)。 求所有组队方案的总代价。 传送门
不难发现,这道题目可以转化成: ∑ i = 1 n C n i ∗ i k ∑_{i=1}^nC_{n}^{i}∗i^ k i=1∑nCni∗ik 但这要超时,怎么办呢?我们可以通过第二类斯特林数、组合数学、阶乘来分解 i k i^k ik: i k = ∑ j = 0 k S k j ∗ j ! ∗ C i j i^k=\sum_{j=0}^{k}S_{k}^{j}*j!*C_{i}^{j} ik=j=0∑kSkj∗j!∗Cij 我们可以这样理解:把k个球放进i个盒子里,选择 0 ∼ k 0\sim k 0∼k个盒子放球,每次选 j j j个盒子,把球分成 j j j堆,在给这些堆来一个全排列放进盒子里,就涵盖了所有放球情况。 然后继续来分解: ∑ i = 1 n C n i ∑ j = 0 k S k j ∗ j ! ∗ C i j \sum_{i=1}^{n}C_{n}^{i}\sum_{j=0}^{k}S_{k}^{j}*j!*C_{i}^{j} i=1∑nCnij=0∑kSkj∗j!∗Cij S k j S_{k}^{j} Skj和 j ! j! j!对于内层循环是定值,可以提到外面来: → ∑ j = 0 k S k j ∗ j ! ∑ i = 1 n C n i ∗ C i j \rightarrow \sum_{j=0}^{k}S_{k}^{j}*j!\sum_{i=1}^{n}C_{n}^{i}*C_{i}^{j} →j=0∑kSkj∗j!i=1∑nCni∗Cij 然后后面的 C n i ∗ C i j C_{n}^{i}*C_{i}^{j} Cni∗Cij可以通过组合数的一个性质: C n m ∗ C m r = C n r ∗ C n − r m − r C_{n}^{m}*C_{m}^{r}=C_{n}^{r}*C_{n-r}^{m-r} Cnm∗Cmr=Cnr∗Cn−rm−r
证明: C n m ∗ C m r C_{n}^{m}*C_{m}^{r} Cnm∗Cmr = m ! ∗ ( n − m ) ! n ! ∗ r ! ∗ ( m − r ) ! m ! =\frac{m!*(n-m)!}{n!}*\frac{r!*(m-r)!}{m!} =n!m!∗(n−m)!∗m!r!∗(m−r)! = ( n − m ) ! ∗ r ! ∗ ( m − r ) ! n ! =\frac{(n-m)!*r!*(m-r)!}{n!} =n!(n−m)!∗r!∗(m−r)! = ( n − m ) ! ∗ r ! ∗ ( m − r ) ! ∗ ( n − r ) ! n ! ∗ ( n − r ) ! =\frac{(n-m)!*r!*(m-r)!*(n-r)!}{n!*(n-r)!} =n!∗(n−r)!(n−m)!∗r!∗(m−r)!∗(n−r)! = r ! ∗ ( n − r ) ! n ! ∗ ( m − r ) ! ∗ ( n − m ) ! ( n − r ) ! =\frac{r!*(n-r)!}{n!}*\frac{(m-r)!*(n-m)!}{(n-r)!} =n!r!∗(n−r)!∗(n−r)!(m−r)!∗(n−m)! = C n r ∗ C n − r m − r =C_{n}^{r}*C_{n-r}^{m-r} =Cnr∗Cn−rm−r
于是我们又可以继续推: → ∑ j = 0 k S k j ∗ j ! ∗ C n j ∑ i = 1 n C n − j i − j \rightarrow \sum_{j=0}^{k}S_{k}^{j}*j!*C_{n}^{j}\sum_{i=1}^{n}C_{n-j}^{i-j} →j=0∑kSkj∗j!∗Cnji=1∑nCn−ji−j 然后让我们来观察一下 ∑ i = 1 n C n − j i − j \sum_{i=1}^{n}C_{n-j}^{i-j} ∑i=1nCn−ji−j,其实当 i < j i<j i<j时没有意义,若 i > = j i>=j i>=j就将 i − j i-j i−j视为 t t t,则相当于求 ∑ t = 0 n − j C n − j t \sum_{t=0}^{n-j}C_{n-j}^{t} ∑t=0n−jCn−jt,这显而易见等于 2 n − j 2^{n-j} 2n−j,最后就化为: → ∑ j = 0 k S k j ∗ j ! ∗ C n j ∗ 2 n − j \rightarrow \sum_{j=0}^{k}S_{k}^{j}*j!*C_{n}^{j}*2^{n-j} →j=0∑kSkj∗j!∗Cnj∗2n−j n太大?我们只用预处理第二类斯特林数,其他的东西跟随着循环递推就行了。So easy!
