Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "math"8)9 1011func CF161D(_r io.Reader, out io.Writer) {12 in := bufio.NewReader(_r)13 var n, k, v, w ,ans int14 Fscan(in, &n, &k)15 k = min(k, n-1)16 g := make([][]int, n)17 for i := 1; i < n; i++ {18 Fscan(in, &v, &w)19 v--20 w--21 g[v] = append(g[v], w)22 g[w] = append(g[w], v)23 }24 25 markCentroid := make([]bool, len(g))26 size := make([]int, len(g))27 var findCentroid func(int, int, int) (int, int, int)28 findCentroid = func(v, fa, compSize int) (minSize, ct, faCt int) {29 minSize = math.MaxInt30 maxSubSize := 031 size[v] = 132 for _, w := range g[v] {33 if w != fa && !markCentroid[w] {34 if minSizeW, ctW, faCtW := findCentroid(w, v, compSize); minSizeW < minSize {35 minSize, ct, faCt = minSizeW, ctW, faCtW36 }37 maxSubSize = max(maxSubSize, size[w])38 size[v] += size[w]39 }40 }41 maxSubSize = max(maxSubSize, compSize-size[v])42 if maxSubSize < minSize {43 minSize, ct, faCt = maxSubSize, v, fa44 }45 return46 }47 48 _cnt := make([]int, n)49 _cnt[0] = 150 tmp := make([]int, n)51 var dfs func(int, int, int)52 dfs = func(v, fa, compSize int) {53 _, ct, faCt := findCentroid(v, fa, compSize)54 markCentroid[ct] = true55 defer func() { markCentroid[ct] = false }()56 for _, w := range g[ct] {57 if !markCentroid[w] {58 if w != faCt {59 dfs(w, ct, size[w])60 } else {61 dfs(w, ct, compSize-size[ct])62 }63 }64 }65 66 cnt := _cnt[:1]67 for _, w := range g[ct] {68 if markCentroid[w] {69 continue70 }71 t := tmp[:1]72 var f func(int, int, int)73 f = func(v, fa, d int) {74 if k-d < len(cnt) {75 ans += cnt[k-d]76 }77 if d == len(t) {78 t = append(t, 1)79 } else {80 t[d]++81 }82 if d >= k {83 return84 }85 for _, w := range g[v] {86 if w != fa && !markCentroid[w] {87 f(w, v, d+1)88 }89 }90 }91 f(w, ct, 1)92 for i, c := range t {93 if i >= len(cnt) {94 cnt = append(cnt, c)95 } else {96 cnt[i] += c97 }98 }99 }100 }101 dfs(0, -1, len(g))102 Fprint(out, ans)103}104 105106