zoukankan      html  css  js  c++  java
  • 「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;
    }
    
  • 相关阅读:
    CF140CNew Year Snowmen
    ZR10.1青岛集训三地联考
    CF1228——记一次和紫名失之交臂的CF
    CF1220
    codeforce 382 div2 E —— 树状dp
    codeforce 381 div2
    codeforce 380(div.2)
    Bishops Alliance—— 最大上升子序列
    codeforce 379(div.2)
    模板——BigInteger
  • 原文地址:https://www.cnblogs.com/lizbaka/p/10594393.html
Copyright © 2011-2022 走看看