Discription
You have a team of N people. For a particular task, you can pick any non-empty subset of people. The cost of having x people for the task is xk.
Output the sum of costs over all non-empty subsets of people.
Input
Only line of input contains two integers N (1?≤?N?≤?109) representing total number of people and k (1?≤?k?≤?5000).
Output
Output the sum of costs for all non empty subsets modulo 109?+?7.
Example
1 1
1
3 2
24
Note
In the first example, there is only one non-empty subset {1} with cost 11?=?1.
In the second example, there are seven non-empty subsets.
- {1} with cost 12?=?1
- {2} with cost 12?=?1
- {1,?2} with cost 22?=?4
- {3} with cost 12?=?1
- {1,?3} with cost 22?=?4
- {2,?3} with cost 22?=?4
- {1,?2,?3} with cost 32?=?9
The total cost is 1?+?1?+?4?+?1?+?4?+?4?+?9?=?24.
题目大意就是要你求一下ΣC(n,i)*i^k。
然后直接上我推的式子了(就是用第二类斯特林数代换一下)
(怎么这个图这么大。。。。不管了)
然后就开开心心A了。
不过好像k再大一点也可以做,,,就是要用FFT 在N log N的时间求出某一行的斯特林数了(反正我也不会hhhh),不能再N^2递推斯特林数了。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #define ll long long #define maxn 5005 using namespace std; const int ha=1000000007; const int inv=ha/2+1; int S[maxn],n,m; int ans=0,tmp,ci; inline void init(){ S[1]=1; for(int i=2;i<=m;i++) for(int j=i;j;j--){ S[j]=(S[j]*(ll)j+(ll)S[j-1])%ha; } } inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an; } inline void solve(){ tmp=1,ci=ksm(2,n); for(int i=1;i<=m;i++){ tmp=tmp*(ll)(n-i+1)%ha; ci=ci*(ll)inv%ha; ans=((ll)ans+S[i]*(ll)tmp%ha*(ll)ci)%ha; } } int main(){ scanf("%d%d",&n,&m); init(); solve(); printf("%d\n",ans); return 0; }