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; }