zoukankan      html  css  js  c++  java
  • CF 932E Team Work

    CF 932E Team Work

    传送门
    题意:求一个和式

    [sum_{i=0}^n inom{n}{x} i^k ]

    这个时候我们需要推一下式子,我们把(i^k)用第二类斯特林数展开:

    [i^k=sum_{j=0}^kj!S(k,j)inom{i}{j} ]

    [sum_{i=0}^nfrac{n!}{(n-i)!}sum_{j=0}^kfrac{S(k,j)}{(i-j)!} ]

    [sum_{j=0}^kS(k,j) sum_{i=j}^nfrac{n!}{(n-i)!(i-j)!} ]

    [sum_{j=0}^kS(k,j)frac{n!}{(n-j)!}sum_{i=j}^nfrac{(n-j)!}{(n-i)!(i-j)!} ]

    [sum_{j=0}^{min(n,k)}frac{n!}{(n-j)!}S(k,j)2^{n-j} ]

    接下来的事情就是,在O((k^2))内的时间预处理出第二类斯特林数,然后套用上面的算式就行了。

    #include<bits/stdc++.h>
    
    #define all(x) x.begin(),x.end()
    #define fi first
    #define sd second
    #define lson (nd<<1)
    #define rson (nd+nd+1)
    #define PB push_back
    #define mid (l+r>>1)
    #define MP make_pair
    #define SZ(x) (int)x.size()
    
    using namespace std;
    
    typedef long long LL;
    
    typedef vector<int> VI;
    
    typedef pair<int,int> PII;
    
    inline int read(){
        int res=0, f=1;char ch=getchar();
        while(ch<'0'|ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){res=res*10+ch-'0';ch=getchar();}
        return res*f;
    }
    
    const int MAXN = 200'005;
    
    const int MOD = 1e9+7;
    
    void addmod(int& a, int b){a+=b;if(a>=MOD)a-=MOD;}
    int mulmod(int a, int b){return 1ll*a*b%MOD;}
    
    template<typename T>
    void chmin(T& a, T b){if(a>b)a=b;}
    
    template<typename T>
    void chmax(T& a, T b){if(b>a)a=b;}
    
    int fac[MAXN], inv[MAXN];
    
    int S[5005][5005];
    
    int n, k;
    
    void init(){
        fac[0]=inv[0]=inv[1]=1;
        for(int i=1;i<=200000;++i)fac[i]=1ll*i*fac[i-1]%MOD;
        for(int i=2;i<=200000;++i)inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD;
        for(int i=1;i<=200000;++i)inv[i]=1ll*inv[i-1]*inv[i]%MOD;
    
        S[0][0]=1;
        for(int i=1;i<=5000;++i){
            for(int j=1;j<=i;++j)S[i][j]=(1ll*S[i-1][j-1]+1ll*j*S[i-1][j])%MOD;
        }
    }
    
    int powmod(int x, int y){
        int res=1;
        while(y){
            if(y&1)
                res=1ll*res*x%MOD;
            x=1ll*x*x%MOD;
            y>>=1;
        }
    
        return res;
    }
    
    int getVal(int x, int y){
        int res=1;
        for(int i=0;i<y;++i)res=1ll*res*(x-i)%MOD;
        return res%MOD;
    }
    
    int main(){
        init();
        n=read(),k=read();
        int res=0;
        for(int i=0;i<=min(n,k);++i){
            res+=1ll*getVal(n,i)%MOD*S[k][i]%MOD*powmod(2,n-i)%MOD;
            res%=MOD;
        }
    
        cout<<(res%MOD+MOD)%MOD;
    
        return 0;
    }
    
    
    
  • 相关阅读:
    BZOJ 1036:树的统计Count(树链剖分)
    HDU 5950:Recursive sequence(矩阵快速幂)
    POJ 2763:Housewife Wind(树链剖分)
    HDU 2222:Keywords Search(AC自动机模板)
    HDU 3966:Aragorn's Story(树链剖分)
    矩阵乘法
    HDU 4635:Strongly connected(强连通)
    HDU 3078:Network(LCA之tarjan)
    HDU 2767:Proving Equivalences(强连通)
    HDU 1827:Summer Holiday(强连通)
  • 原文地址:https://www.cnblogs.com/JohnRan/p/12828447.html
Copyright © 2011-2022 走看看