正题
题目链接:https://www.luogu.com.cn/problem/CF932E
题目大意
给出n,kn,kn,k,求∑i=1nC(n,i)∗ik\sum_{i=1}^nC(n,i)*i^ki=1∑nC(n,i)∗ik
解题思路
上式子的话,大体是先拆开iki^kik变成∑i=1n(ni)∑j=0k{kj}(ij)j!\sum_{i=1}^n\binom{n}{i}\sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}\binom{i}{j}j!i=1∑n(in)j=0∑k{kj}(ji)j!
⇒∑i=1n∑j=0k{kj}(ij)(ni)j!\Rightarrow \sum_{i=1}^n\sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}\binom{i}{j}\binom{n}{i}j!⇒i=1∑nj=0∑k{kj}(ji)(in)j!
拆开CCC然后化解一下
⇒∑i=1n∑j=0k{kj}∗1(i−j)!∗n!(n−i)!\Rightarrow \sum_{i=1}^n\sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}*\frac{1}{(i-j)!}*\frac{n!}{(n-i)!}⇒i=1∑nj=0∑k{kj}∗(i−j)!1∗(n−i)!n!
⇒∑j=0k{kj}n!(n−j)!∑i=0n(n−jn−i)\Rightarrow \sum_{j=0}^k \begin{Bmatrix}k\\j\end{Bmatrix}\frac{n!}{(n-j)!}\sum_{i=0}^{n}\binom{n-j}{n-i}⇒j=0∑k{kj}(n−j)!n!i=0∑n(n−in−j)
∑j=1k{kj}P(n,j)∗2n−j\sum_{j=1}^k\begin{Bmatrix}k\\j\end{Bmatrix}P(n,j)*2^{n-j}j=1∑k{kj}P(n,j)∗2n−j
理解一下的话就是最开的式子的意义是:在nnn种颜色中选择若干种然后再去涂kkk个物品,求方案种数。转换一下的话我们可以把kkk个物品分成若干个集合,每个物品集合颜色相同,然后再nnn个颜色中排列出这些颜色,剩下的都是可选可不选的。
然后递推处理第二类斯特林数就好了,时间复杂度O(k2)O(k^2)O(k2)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5100,XJQ=1e9+7;
ll n,k,S[N][N],ans;
ll power(ll x,ll b){ll ans=1;if(b<0)return power(power(x,-b),XJQ-2);while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
ll P(ll n,ll m){ll tmp=1;if(n<m)return 0;for(ll i=n-m+1;i<=n;i++)tmp=tmp*i%XJQ;return tmp;
}
int main()
{scanf("%lld%lld",&n,&k);S[0][0]=1;for(ll i=1;i<=k;i++)for(ll j=1;j<=i;j++)S[i][j]=(S[i-1][j-1]+j*S[i-1][j]%XJQ)%XJQ;for(ll i=0;i<=k;i++)(ans+=S[k][i]*P(n,i)%XJQ*power(2,n-i)%XJQ)%=XJQ;if(!k)ans--;printf("%lld",ans);return 0;
}