传送门: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; }