题意
给定n和k,求
∑ni=1Cin∗ik
∑
i
=
1
n
C
n
i
∗
i
k
,取模。
n<=10^9,k<=5000
分析
这题有一种对二项式定理求k阶导的做法,但是好麻烦。
可以考虑到这个式子的组合意义,
ik
i
k
表示k个带标号球放到i个带标号盒子(可以有空盒)的方案,
Cin
C
n
i
看成从n个带标号盒子里选出i个的方案。
随便推一推不难发现答案就是
∑ni=1S(k,i)∗i!∗2n−i
∑
i
=
1
n
S
(
k
,
i
)
∗
i
!
∗
2
n
−
i
,其中
S(k,i)
S
(
k
,
i
)
表示第二类斯大林数。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=5005;
const int MOD=1000000007;
int n,k,f[N][N];
int ksm(int x,int y)
{
int ans=1;
while (y)
{
if (y&1) ans=(LL)ans*x%MOD;
x=(LL)x*x%MOD;y>>=1;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&k);
f[1][1]=n;
for (int i=2;i<=k;i++)
for (int j=1;j<=min(n,i);j++)
f[i][j]=((LL)f[i-1][j]*j+(LL)f[i-1][j-1]*(n-j+1))%MOD;
int ans=0;
for (int i=1;i<=min(n,k);i++) (ans+=(LL)f[k][i]*ksm(2,n-i)%MOD)%=MOD;
printf("%d",ans);
return 0;
}