求$\sum_{i=1}^{n}{C(n,i)*i^k}$,其中$n \leq 10^9 ,k \leq 5000$。
看到$i^k$,k那么小,直接第二类斯特林数。比较简单,就请允许我鸽了吧。
刚开始还想BM,当然T了。
1 // luogu-judger-enable-o2 2 #include<bits/stdc++.h> 3 #define mod 1000000007 4 using namespace std; 5 typedef long long int ll; 6 const int maxn=5E3+5; 7 ll n,k,ans,S[maxn][maxn]; 8 inline ll qpow(ll x,ll y) 9 { 10 ll ans=1,base=x; 11 while(y) 12 { 13 if(y&1) 14 ans=ans*base%mod; 15 base=base*base%mod; 16 y>>=1; 17 } 18 return ans; 19 } 20 void init() 21 { 22 S[0][0]=1; 23 for(int i=1;i<=k;++i) 24 for(int j=1;j<=k;++j) 25 S[i][j]=(S[i-1][j-1]+S[i-1][j]*(ll)j)%mod; 26 } 27 int main() 28 { 29 ios::sync_with_stdio(false); 30 cin>>n>>k; 31 init(); 32 ll now=1; 33 for(int i=0;i<=k;++i) 34 { 35 ans=(ans+S[k][i]*now%mod*qpow(2,n-i)%mod)%mod; 36 now=now*(n-i)%mod; 37 } 38 if(k==0) 39 --ans; 40 cout<<ans<<endl; 41 return 0; 42 }
原文:https://www.cnblogs.com/GreenDuck/p/11409354.html