一、题目
二、解法
水题,乱推,第二类斯特林数展开次方式:
∑
i
=
1
n
C
(
n
,
i
)
∑
j
=
0
m
C
(
i
,
j
)
×
j
!
×
S
(
m
,
j
)
\sum_{i=1}^nC(n,i)\sum_{j=0}^m C(i,j)\times j!\times S(m,j)
i=1∑nC(n,i)j=0∑mC(i,j)×j!×S(m,j)
∑
i
=
1
n
∑
j
=
0
m
C
(
n
,
j
)
×
C
(
n
−
j
,
i
−
j
)
×
j
!
×
S
(
m
,
j
)
\sum_{i=1}^n\sum_{j=0}^mC(n,j)\times C(n-j,i-j)\times j!\times S(m,j)
i=1∑nj=0∑mC(n,j)×C(n−j,i−j)×j!×S(m,j)
∑
j
=
0
m
C
(
n
,
j
)
×
j
!
×
S
(
m
,
j
)
∑
i
=
j
n
C
(
n
−
j
,
i
−
j
)
\sum_{j=0}^mC(n,j)\times j!\times S(m,j)\sum_{i=j}^nC(n-j,i-j)
j=0∑mC(n,j)×j!×S(m,j)i=j∑nC(n−j,i−j)仔细观察,最后面那一项实际上是对杨辉三角一整行的求和,所以:
∑
j
=
0
m
C
(
n
,
j
)
×
j
!
×
S
(
m
,
j
)
×
2
n
−
j
\sum_{j=0}^mC(n,j)\times j!\times S(m,j)\times 2^{n-j}
j=0∑mC(n,j)×j!×S(m,j)×2n−j然后有手就行,组合数第二维不大直接算(但是我第一回斯特林数写错了嘤嘤嘤)。
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 5005;
const int MOD = 1e9+7;
#define int long long
int read()
{
int x=0,f=1;char c;
while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
int n,m,ans,A=1,S[M][M];
void init()
{
S[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=1;j<=i;j++)
S[i][j]=(S[i-1][j-1]+j*S[i-1][j])%MOD;
}
int qkpow(int a,int b)
{
int r=1;
while(b>0)
{
if(b&1) r=r*a%MOD;
a=a*a%MOD;
b>>=1;
}
return r;
}
signed main()
{
n=read();m=read();
init();
for(int j=0;j<=m;j++)
{
ans=(ans+A*S[m][j]%MOD*qkpow(2,n-j)%MOD)%MOD;
A=A*(n-j)%MOD;
}
printf("%lld\n",ans);
}