CF932E

斯特林数好题:

求$\sum_{i=1}^{n}C_{n}^{i}i^{k}$

首先第二类斯特林数有一个性质:

$x^{n}=\sum_{i=0}^{n}S_{2}(n,i)C_{x}^{i}i!$

那么我们展开原来的表达式,得到:

$\sum_{i=1}^{n}C_{n}^{i}i^{k}$=$\sum_{i=0}^{n}C_{n}^{i}i^{k}$=$\sum_{i=0}^{n}C_{n}^{i}\sum_{j=0}^{k}S_{2}(k,j)C_{i}^{j}j!$

整理一下后面的式子,顺便展开组合数,得到:

$\sum_{i=0}^{n}\frac{n!}{i!(n-i)!}\sum_{j=0}^{k}S_{2}(k,j)\frac{i!}{j!(i-j)!}j!$

立刻能继续整理:

$\sum_{i=0}^{n}\frac{n!}{(n-i)!}\sum_{j=0}^{k}S_{2}(k,j)\frac{1}{(i-j)!}$

调整一下枚举顺序:

$\sum_{j=0}^{k}S_{2}(k,j)\sum_{i=0}^{n}\frac{n!}{(n-i)!(i-j)!}$

再补一项:

$\sum_{j=0}^{k}S_{2}(k,j)\sum_{i=0}^{n}\frac{n!}{(n-i)!(i-j)!}\frac{(n-j)!}{(n-j)!}$

这样就可以整理出一个组合数:

$\sum_{j=0}^{k}S_{2}(k,j)\sum_{i=0}^{n}\frac{n!}{(n-j)!}\frac{(n-j)!}{(n-i)!(i-j)!}$

也就是:

$\sum_{j=0}^{k}S_{2}(k,j)\sum_{i=0}^{n}\frac{n!}{(n-j)!}C_{n-j}^{n-i}$

再提一项出来:

$\sum_{j=0}^{k}S_{2}(k,j)\frac{n!}{(n-j)!}\sum_{i=0}^{n}C_{n-j}^{n-i}$

后面那个求和式发现是对杨辉三角的某一行求和,根据结论,有:

$\sum_{j=0}^{k}S_{2}(k,j)\frac{n!}{(n-j)!}2^{n-j}$

这就可以算了

第二类斯特林数递推式:$S_{2}(i,j)=S_{2}(i-1,j-1)+jS_{2}(i-1,j)$

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
const ll mode=1000000007;
ll S[5005][5005];
int n,k;
ll pow_mul(ll x,ll y)
{
    ll ret=1;
    while(y)
    {
        if(y&1)ret=ret*x%mode;
        x=x*x%mode,y>>=1;
    }
    return ret;
}
int main()
{
    scanf("%d%d",&n,&k);
    S[0][0]=1;
    for(int i=1;i<=k;i++)for(int j=1;j<=i;j++)S[i][j]=(j*S[i-1][j]+S[i-1][j-1])%mode;
    ll las=1,mul=pow_mul(2,n),inv=(mode+1)>>1;
    ll ans=0;
    for(int i=0;i<=k;i++)
    {
        ans=(ans+S[k][i]*las%mode*mul%mode)%mode;
        las=las*(n-i)%mode;
        mul=mul*inv%mode;
    }
    printf("%lld\n",ans);
    return 0;
} 

 

posted @ 2019-06-21 15:56  lleozhang  Views(239)  Comments(0Edit  收藏  举报
levels of contents