题目
求 ∑ i = 1 n C ( n , i ) i k \sum_{i=1}^nC(n,i)i^k i=1∑nC(n,i)ik
分析
根据第二类斯特林数的性质可以得到
∑
i
=
1
n
n
!
i
!
(
n
−
i
)
!
∑
j
=
0
k
S
(
k
,
j
)
i
!
(
i
−
j
)
!
j
!
j
!
\sum_{i=1}^n\frac{n!}{i!(n-i)!}\sum_{j=0}^kS(k,j)\frac{i!}{(i-j)!j!}j!
i=1∑ni!(n−i)!n!j=0∑kS(k,j)(i−j)!j!i!j!
=
∑
i
=
1
n
n
!
(
n
−
i
)
!
∑
j
=
0
k
S
(
k
,
j
)
1
(
i
−
j
)
!
=\sum_{i=1}^n\frac{n!}{(n-i)!}\sum_{j=0}^kS(k,j)\frac{1}{(i-j)!}
=i=1∑n(n−i)!n!j=0∑kS(k,j)(i−j)!1
=
∑
i
=
1
n
∑
j
=
0
k
S
(
k
,
j
)
n
!
(
n
−
i
)
!
(
i
−
j
)
!
=\sum_{i=1}^n\sum_{j=0}^kS(k,j)\frac{n!}{(n-i)!(i-j)!}
=i=1∑nj=0∑kS(k,j)(n−i)!(i−j)!n!
=
∑
i
=
1
n
∑
j
=
0
k
S
(
k
,
j
)
(
n
−
j
)
!
(
n
−
i
)
!
(
i
−
j
)
!
×
n
!
(
n
−
j
)
!
=\sum_{i=1}^n\sum_{j=0}^kS(k,j)\frac{(n-j)!}{(n-i)!(i-j)!}\times \frac{n!}{(n-j)!}
=i=1∑nj=0∑kS(k,j)(n−i)!(i−j)!(n−j)!×(n−j)!n!
=
∑
j
=
0
k
S
(
k
,
j
)
n
!
(
n
−
j
)
!
∑
i
=
1
n
C
(
n
−
j
,
n
−
i
)
=\sum_{j=0}^kS(k,j)\frac{n!}{(n-j)!}\sum_{i=1}^nC(n-j,n-i)
=j=0∑kS(k,j)(n−j)!n!i=1∑nC(n−j,n−i)
=
∑
j
=
0
k
S
(
k
,
j
)
n
!
(
n
−
j
)
!
2
n
−
j
=\sum_{j=0}^kS(k,j)\frac{n!}{(n-j)!}2^{n-j}
=j=0∑kS(k,j)(n−j)!n!2n−j
但是如果
k
=
0
k=0
k=0时答案要减1
代码
#include <cstdio>
#define rr register
using namespace std;
const int mod=1e9+7,inv=5e8+4;
int n,m,stir[5001][5001],ans;
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
signed main(){
scanf("%d%d",&n,&m); stir[0][0]=1;
for (rr int i=1;i<=m;++i)
for (rr int j=1;j<=i;++j)
stir[i][j]=mo(stir[i-1][j-1],1ll*stir[i-1][j]*j%mod);
rr int jc=1,fac=ksm(2,n);
for (rr int i=0;i<=m;++i){
ans=mo(ans,1ll*jc*fac%mod*stir[m][i]%mod),
jc=1ll*jc*(n-i)%mod,fac=1ll*fac*inv%mod;
}
return !printf("%d",ans-(!m));
}