背景:
斯特林数学习中。
题目传送门:
https://www.luogu.org/problem/CF932E
题意:
求
∑
i
=
1
n
C
n
i
i
k
\sum_{i=1}^{n}C_{n}^{i}i^k
∑i=1nCniik。
思路:
大力化化简式子。
∑
i
=
1
n
C
n
i
i
k
\sum_{i=1}^{n}C_{n}^{i}i^k
i=1∑nCniik
考虑到:
i
k
=
∑
j
=
0
k
S
i
,
j
C
i
,
j
j
!
i^k=\sum_{j=0}^{k}S_{i,j}C_{i,j}j!
ik=∑j=0kSi,jCi,jj!,因此有:
=
∑
i
=
1
n
C
n
i
∑
j
=
0
k
S
k
,
j
C
i
,
j
j
!
=\sum_{i=1}^{n}C_{n}^{i}\sum_{j=0}^{k}S_{k,j}C_{i,j}j!
=i=1∑nCnij=0∑kSk,jCi,jj!
= ∑ i = 1 n n ! i ! ( n − i ) ! ∑ j = 0 k S k , j i ! j ! ( i − j ) ! j ! =\sum_{i=1}^{n}\frac{n!}{i!(n-i)!}\sum_{j=0}^{k}S_{k,j}\frac{i!}{j!(i-j)!}j! =i=1∑ni!(n−i)!n!j=0∑kSk,jj!(i−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}^{k}S_{k,j}\frac{1}{(i-j)!} =i=1∑n(n−i)!n!j=0∑kSk,j(i−j)!1
= ∑ j = 0 k S k , j ∑ i = 1 n n ! ( n − i ) ! ( i − j ) ! =\sum_{j=0}^{k}S_{k,j}\sum_{i=1}^{n}\frac{n!}{(n-i)!(i-j)!} =j=0∑kSk,ji=1∑n(n−i)!(i−j)!n!
上下同时乘上
(
n
−
j
)
!
(n-j)!
(n−j)!,有:
=
∑
j
=
0
k
S
k
,
j
∑
i
=
1
n
(
n
−
j
)
!
(
n
−
i
)
!
(
i
−
j
)
!
n
!
(
n
−
j
)
!
=\sum_{j=0}^{k}S_{k,j}\sum_{i=1}^{n}\frac{(n-j)!}{(n-i)!(i-j)!}\frac{n!}{(n-j)!}
=j=0∑kSk,ji=1∑n(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}^{k}S_{k,j}\frac{n!}{(n-j)!}\sum_{i=1}^{n}C_{n-j}^{n-i} =j=0∑kSk,j(n−j)!n!i=1∑nCn−jn−i
考虑到 ∑ i = 1 n C n i = 2 i \sum_{i=1}^{n}C_{n}^{i}=2^i ∑i=1nCni=2i,二项式定理可证(即使 n − i > n − j n-i>n-j n−i>n−j也没有关系,因为 C n − j n − i = 0 C_{n-j}^{n-i}=0 Cn−jn−i=0)因此有:
= ∑ j = 0 k S k , j n ! ( n − j ) ! 2 n − j =\sum_{j=0}^{k}S_{k,j}\frac{n!}{(n-j)!}2^{n-j} =j=0∑kSk,j(n−j)!n!2n−j
Θ ( n 2 ) \Theta(n^2) Θ(n2)处理 S k , j S_{k,j} Sk,j即可,然后带入求解,即可通过。
能更优秀吗?
考虑到
S
k
,
j
=
∑
i
=
0
j
(
−
1
)
i
i
!
(
j
−
i
)
k
(
j
−
i
)
!
S_{k,j}=\sum_{i=0}^{j}\frac{(-1)^i}{i!}\frac{(j-i)^k}{(j-i)!}
Sk,j=∑i=0ji!(−1)i(j−i)!(j−i)k,因此有:
= ∑ j = 0 k ∑ i = 0 j ( − 1 ) i i ! ( j − i ) k ( j − i ) ! n ! ( n − j ) ! 2 n − j =\sum_{j=0}^{k}\sum_{i=0}^{j}\frac{(-1)^i}{i!}\frac{(j-i)^k}{(j-i)!}\frac{n!}{(n-j)!}2^{n-j} =j=0∑ki=0∑ji!(−1)i(j−i)!(j−i)k(n−j)!n!2n−j
= ∑ j = 0 k n ! ( n − j ) ! 2 n − j ∑ i = 0 j ( − 1 ) i i ! ( j − i ) k ( j − i ) ! =\sum_{j=0}^{k}\frac{n!}{(n-j)!}2^{n-j}\sum_{i=0}^{j}\frac{(-1)^i}{i!}\frac{(j-i)^k}{(j-i)!} =j=0∑k(n−j)!n!2n−ji=0∑ji!(−1)i(j−i)!(j−i)k
后面的一个
∑
\sum
∑是一个卷积的形式,因此
Θ
(
k
log
k
)
\Theta(k\log k)
Θ(klogk)求解即可。
然而这道题的模数不和谐,因此我才懒得去打。
显然
n
!
(
n
−
j
)
!
\frac{n!}{(n-j)!}
(n−j)!n!不能直接求,怎么办呢?
n
!
(
n
−
j
)
!
=
(
n
−
j
+
1
)
∗
(
n
−
j
+
2
)
∗
(
n
−
j
+
3
)
.
.
.
∗
n
\frac{n!}{(n-j)!}=(n-j+1)*(n-j+2)*(n-j+3)...*n
(n−j)!n!=(n−j+1)∗(n−j+2)∗(n−j+3)...∗n,即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define mod 1000000007
using namespace std;
int n,k,ans=0;
int s[2][5010];
void init()
{
s[1][1]=1;
for(int i=2;i<=k;i++)
for(int j=1;j<=i;j++)
s[i&1][j]=((LL)s[(i&1)^1][j-1]+(LL)j*s[(i&1)^1][j]%mod)%mod;
}
int ksm(int x,int k)
{
int tot=1;
for(;k;k>>=1)
{
if(k&1) tot=(LL)tot*x%mod;
x=(LL)x*x%mod;
}
return tot;
}
int main()
{
scanf("%d %d",&n,&k);
init();
int tmp=n;
for(int i=1;i<=min(n,k);i++)
{
ans=((LL)ans+(LL)s[k&1][i]*tmp%mod*ksm(2,n-i)%mod)%mod;
tmp=(LL)tmp*(n-i)%mod;
}
printf("%d",ans);
}