-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathSum of Kth Power.cpp
37 lines (36 loc) · 974 Bytes
/
Sum of Kth Power.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
LL mod;
LL S[105][105];
// Find 1^k+2^k+...+n^k % mod
void solve() {
LL n, k;
scanf("%lld %lld %lld", &n, &k, &mod);
/*
x^k = sum (i=1 to k) Stirling2(k, i) * i! * ncr(x, i)
sum (x = 0 to n) x^k
= sum (i = 0 to k) Stirling2(k, i) * i! * sum (x = 0 to n) ncr(x, i)
= sum (i = 0 to k) Stirling2(k, i) * i! * ncr(n + 1, i + 1)
= sum (i = 0 to k) Stirling2(k, i) * i! * (n + 1)! / (i + 1)! / (n - i)!
= sum (i = 0 to k) Stirling2(k, i) * (n - i + 1) * (n - i + 2) * ... (n + 1) / (i + 1)
*/
S[0][0] = 1 % mod;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= i; j++) {
if (i == j) S[i][j] = 1 % mod;
else S[i][j] = (j * S[i - 1][j] + S[i - 1][j - 1]) % mod;
}
}
LL ans = 0;
for (int i = 0; i <= k; i++) {
LL fact = 1, z = i + 1;
for (LL j = n - i + 1; j <= n + 1; j++) {
LL mul = j;
if (mul % z == 0) {
mul /= z;
z /= z;
}
fact = (fact * mul) % mod;
}
ans = (ans + S[k][i] * fact) % mod;
}
printf("%lld\n", ans);
}