题目:
题意:
给出
n
,
k
n,k
n,k
求
∑
i
=
1
n
C
n
i
∗
i
k
\sum_{i=1}^nC_n^i*i^k
∑i=1nCni∗ik
分析:
=
∑
i
=
0
n
C
n
i
∗
i
k
=\sum_{i=0}^nC_n^i*i^k
=∑i=0nCni∗ik
=
∑
i
=
0
n
n
!
i
!
(
n
−
i
)
!
∗
∑
j
=
0
k
S
(
k
,
j
)
∗
C
i
j
∗
j
!
=\sum_{i=0}^n\frac{n!}{i!(n-i)!}*\sum_{j=0}^kS(k,j)*C_i^j*j!
=∑i=0ni!(n−i)!n!∗∑j=0kS(k,j)∗Cij∗j!
=
∑
i
=
0
n
n
!
i
!
(
n
−
i
)
!
∗
∑
j
=
0
k
S
(
k
,
j
)
∗
1
(
i
−
j
)
!
=\sum_{i=0}^n\frac{n!}{i!(n-i)!}*\sum_{j=0}^kS(k,j)*\frac{1}{(i-j)!}
=∑i=0ni!(n−i)!n!∗∑j=0kS(k,j)∗(i−j)!1
=
∑
i
=
0
n
∑
j
=
0
k
S
(
k
,
j
)
∗
n
!
(
n
−
i
)
!
(
i
−
j
)
!
=\sum_{i=0}^n\sum_{j=0}^kS(k,j)*\frac{n!}{(n-i)!(i-j)!}
=∑i=0n∑j=0kS(k,j)∗(n−i)!(i−j)!n!
=
∑
j
=
0
k
S
(
k
,
j
)
∗
n
!
(
n
−
j
)
!
∑
i
=
0
n
C
n
−
j
n
−
i
=\sum_{j=0}^kS(k,j)*\frac{n!}{(n-j)!}\sum_{i=0}^nC_{n-j}^{n-i}
=∑j=0kS(k,j)∗(n−j)!n!∑i=0nCn−jn−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=0kS(k,j)∗(n−j)!n!∗2n−j
其中
S
S
S表示第二类斯特林数
如果
k
=
0
k=0
k=0,因为在后面的计算中我们将
0
0
0^0
00当成
1
1
1计算,所以最后答案需要
−
1
-1
−1
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#define LL long long
#define mo 998244353
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
LL ksm(LL x,LL y)
{
LL s=1;
while(y)
{
if(y&1) (s*=x)%=mo;
(x*=x)%=mo;y>>=1;
}
return s;
}
LL s[5005][5005];
int main()
{
LL n=read(),k=read();
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]+s[i-1][j]*j%mo)%mo;
LL p=ksm(2,n),pp=1,ans=0,inv=ksm(2,mo-2);
for(LL i=0;i<=k;i++)
{
(ans+=s[k][i]*pp%mo*p%mo)%=mo;
(p*=inv)%=mo;
(pp*=(n-i+mo)%mo)%=mo;
}
if(!k) ans=(ans-1+mo)%mo;
cout<<ans;
return 0;
}