题目链接
题解
题意
求 ∑ i = 0 n ( n i ) ∗ i k . \sum_{i = 0}^{n} \begin{pmatrix} n\\i\\\end{pmatrix} * i^k. ∑i=0n(ni)∗ik.
思路
f
(
x
)
=
(
1
+
x
)
n
=
∑
i
=
0
n
(
n
i
)
∗
x
i
f(x) = (1 + x)^n = \sum_{i = 0}^n\begin{pmatrix} n\\i\\\end{pmatrix} * x^i
f(x)=(1+x)n=i=0∑n(ni)∗xi
x
f
′
(
x
)
=
∑
i
=
0
n
(
n
i
)
∗
x
i
∗
i
xf'(x) = \sum_{i = 0}^n\begin{pmatrix} n\\i\\\end{pmatrix} * x^i *i
xf′(x)=i=0∑n(ni)∗xi∗i
.
.
.
.
.
.
......
......
x
k
∗
f
(
k
)
(
x
)
=
∑
i
=
0
n
(
n
i
)
∗
i
k
∗
x
i
x^k*f^{(k)}(x) = \sum_{i = 0}^n\begin{pmatrix} n\\i\\\end{pmatrix} * i^k * x^i
xk∗f(k)(x)=i=0∑n(ni)∗ik∗xi
其中,令x == 1
即为所求。
我们定义
f
[
a
]
[
b
]
[
c
]
=
对
x
b
∗
(
1
+
x
)
c
求
导
并
乘
以
x
,
n
次
f[a][b][c] = 对x^b * (1 + x)^c 求导并乘以x,n次
f[a][b][c]=对xb∗(1+x)c求导并乘以x,n次。则
f
[
k
]
[
0
]
[
n
]
f[k][0][n]
f[k][0][n] 即为所求。
转移方程为:
f
[
a
]
[
b
]
[
c
]
=
b
∗
f
[
a
−
1
]
[
b
]
[
c
]
+
c
∗
f
[
a
−
1
]
[
b
+
1
]
[
c
−
1
]
f[a][b][c] = b * f[a- 1][b][c] + c * f[a - 1][b + 1][c - 1]
f[a][b][c]=b∗f[a−1][b][c]+c∗f[a−1][b+1][c−1],
其中当
a
=
=
0
a == 0
a==0 时,
f
[
a
]
[
b
]
[
c
]
=
2
c
f[a][b][c] = 2^c
f[a][b][c]=2c。
其中b、c之和恒等于n,故可以将数组降至三维。
AC代码
递归
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int const N = 5e3 + 10;
int const Mod = 1e9 + 7;
int f[N][N], n, k;
int FastPower(int a, int k) {
int ans = 1;
while (k) {
if (k & 1) ans = 1LL * ans * a % Mod;
a = 1LL * a * a % Mod;
k >>= 1;
}
return ans;
}
int dp(int a, int b) {
if (b > n) return 0;
if (f[a][b] >= 0) return f[a][b];
if (a == 0) return (f[a][b] = FastPower(2, n - b));
return (f[a][b] = (1LL * b * dp(a - 1, b) % Mod + 1LL * (n - b) * dp(a - 1, b + 1) % Mod) % Mod);
}
int main() {
scanf("%d%d", &n, &k);
memset(f, -1, sizeof(f));
printf("%d\n", dp(k, 0));
return 0;
}
参考资料
https://blog.csdn.net/Charlie_jilei/article/details/79330611?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.channel_param