• Codeforces 932E


    传送门:http://codeforces.com/contest/932/problem/E

    对于给定的n、k,求$sum_{r=0}^n inom n rcdot r^k$?

    朴素的求解方法,时间复杂度为O(n·logk)。这个方法是E9的,于是TLE?

    考虑一个二项展开式的形式:$f(x)=(1+x)^n=sum_{r=0}^n inom n rcdot x^r$。

    考虑对f(x)求导,则:$xfrac{mathrm{d}}{mathrm{d}x}f(x)=nx(1+x)^{n-1}=sum_{r=0}^n inom n r r x^r$。

    定义算子$R=xfrac{mathrm{d}}{mathrm{d}x}$,则:$R^k f(x)=sum_{r=0}^n inom n r r^k x^r$。

    在上式中,令x=1,则等式右端的展开式即为待求解项$sum_{r=0}^n inom n r r^k$。于是,考虑求解等式左端的表达式。

    设$g(x;p,q)=x^p (1+x)^q$,$R^s g(x;p,q)|_{x=1}$的值为dp(s,p,q),则由于$xfrac{mathrm{d}}{mathrm{d}x}[x^p (1+x)^q]=px^p(1+x)^q+qx^{p+1}(1+x)^{q-1}$,

    故:$dp(s,p,q)=p*dp(s-1,p,q)+q*dp(s-1,p+1,q-1)$。

    待求解项$sum_{r=0}^n inom n r r^k=dp(k,0,n)$,在本问题中,应注意到p+q=n。注意边界条件。参考程序如下:

    #include <stdio.h>
    #include <stdint.h>
    #include <string.h>
    #define MAX_K 5005
    #define MOD 1000000007LL
    
    int64_t dp[MAX_K][MAX_K];
    
    int64_t pwr(int64_t x, int p)
    {
        if (p == 0) return 1LL;
        if (p & 1) return x * pwr(x, p - 1) % MOD;
        return pwr(x * x % MOD, p >> 1);
    }
    
    int64_t foo(int s, int p, int q)
    {
        if (dp[s][p] != -1) return dp[s][p];
        int64_t res;
        if (s == 0) res = pwr(2, q);
        else if (q == 0) res = pwr(p, s);
        else res = p * foo(s - 1, p, q) + q * foo(s - 1, p + 1, q - 1);
        return dp[s][p] = res % MOD;
    }
    
    int main(void)
    {
        int n, k;
        scanf("%d%d", &n, &k);
        memset(dp, -1, sizeof(dp));
        printf("%d
    ", foo(k, 0, n));
        return 0;
    }
  • 相关阅读:
    jdk .tar.gz 包安装 inAction
    Consistent Hashing原理与实现
    开放GitHub的理由
    dll signing issue
    Regular expression cheat sheet
    DOMElement之Offset
    扫码支付测试点
    SQL注入是什么?如何防止?
    什么是接口测试?为什么要做接口测试?如何开展接口测试?
    软件测试的常识
  • 原文地址:https://www.cnblogs.com/siuginhung/p/8455987.html
Copyright © 2020-2023  润新知