Codeforces 932E - Team Work

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

对于给定的n、k,求$\sum_{r=0}^n \binom n r\cdot r^k$?

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

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

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

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

在上式中,令x=1,则等式右端的展开式即为待求解项$\sum_{r=0}^n \binom 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),则由于$x\frac{\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 \binom 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\n", foo(k, 0, n));
    return 0;
}

 

posted on 2018-02-20 23:15  SiuGinHung  阅读(475)  评论(0编辑  收藏  举报

导航