「CF932E」Team Work

「CF932E」Team Work

problem

Solution

题意:求(sum_{i=1}^negin{pmatrix}n\iend{pmatrix} imes i^k)

大力颓柿子,根据常幂转下降幂公式,有

[sum_{i=1}^negin{pmatrix}n\iend{pmatrix} imes i^k ]

[=sum_{i=1}^negin{pmatrix}n\iend{pmatrix}sum_{j=0}^iegin{Bmatrix}k\jend{Bmatrix} imes i^{underline j} ]

[=sum_{i=1}^negin{pmatrix}n\iend{pmatrix}sum_{j=0}^iegin{Bmatrix}k\jend{Bmatrix} imes j!egin{pmatrix}i\jend{pmatrix} ]

[=sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}sum_{i=j}^nfrac{n!}{i!(n-i)!} imes j! imes frac{i!}{j!(i-j)!} ]

[=sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}sum_{i=j}^nfrac{n!}{(n-i)!} imes frac{1}{(i-j)!} ]

后面那个求和上下同乘((n-j)!),有

[sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}sum_{i=j}^nfrac{n!}{(n-i)!} imes frac{1}{(i-j)} imesfrac{(n-j)!}{(n-j)!} ]

[=sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}frac{n!}{(n-j)!}sum_{i=j}^negin{pmatrix}n-j\n-iend{pmatrix} ]

(i<j)的时候组合数为(0),不妨把(i)的下界变为(0),于是有

[sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}frac{n!}{(n-j)!}sum_{i=0}^negin{pmatrix}n-j\n-iend{pmatrix} ]

[=sum_{j=0}^{min(n,k)}egin{Bmatrix}k\jend{Bmatrix}frac{n!}{(n-j)!} imes 2^{n-j} ]

于是我们可以(O(k^2))递推求出第二类斯特林数,枚举(j)时迭代计算(frac{n!}{(n-j)!}),快速幂计算(2^{n-j})即可

Code

#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#define inv(x) (fastpow((x),mod-2))
using namespace std;
typedef long long ll;

template <typename T> void read (T &t)
{
	t=0;int f=0;char c=getchar();
	while(!isdigit(c)){f|=c=='-';c=getchar();}
	while(isdigit(c)){t=t*10+c-'0';c=getchar();}
	if(f)t=-t;
}

const int maxk=5000+5;
const ll mod=1e9+7;


ll n,k; 
ll s[maxk][maxk];

ll fastpow(ll a,ll b)
{
	ll re=1,base=a;
	while(b)
	{
		if(b&1)
			re=re*base%mod;
		base=base*base%mod;
		b>>=1;
	}
	return re;
}

int main()
{
	read(n),read(k);
	s[0][0]=1;
	for(register ll i=1;i<=k;++i)
		for(register ll j=1;j<=i;++j)
			s[i][j]=(s[i-1][j-1]+j*s[i-1][j]%mod)%mod;
	ll kkk=1,ans=0;
	for(register ll j=0;j<=min(n,k);++j)
	{
		ans=(ans+s[k][j]*kkk%mod*fastpow(2,n-j)%mod)%mod;
		kkk=kkk*(n-j)%mod;
	}
	printf("%lld",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/lizbaka/p/10594393.html