forked from EndlessCheng/codeforces-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
1515E.go
54 lines (50 loc) · 1 KB
/
1515E.go
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main
import (
. "fmt"
"io"
)
// github.com/EndlessCheng/codeforces-go
func CF1515E(in io.Reader, out io.Writer) {
var n int
var mod, ans int64
Fscan(in, &n, &mod)
inv := make([]int64, n+1)
inv[1] = 1
for i := 2; i <= n; i++ {
inv[i] = (mod - mod/int64(i)) * inv[mod%int64(i)] % mod
}
dp := [2][][]int64{}
for i := range dp {
dp[i] = make([][]int64, n+1)
for j := range dp[i] {
dp[i][j] = make([]int64, n+1)
}
}
dp[1][1][1] = 1
for i := 2; i <= n; i++ {
cur, pre := dp[i&1], dp[i&1^1]
for _, r := range cur {
for j := range r {
r[j] = 0
}
}
cur[1][0] = pre[1][1]
for j := 2; j <= i; j++ {
for k := 1; k <= j; k++ {
cur[j][0] += pre[j][k]
}
cur[j][0] %= mod
cur[j][1] = pre[j-1][0] * int64(j) % mod
for k := 2; k <= j; k++ {
cur[j][k] = pre[j-1][k-1] * int64(j) * 2 % mod * inv[k] % mod
}
}
}
for _, r := range dp[n&1] {
for _, v := range r[1:] {
ans += v
}
}
Fprint(out, ans%mod)
}
//func main() { CF1515E(os.Stdin, os.Stdout) }