#include <bits/stdc++.h>
const long long maxk = 8;
const long long maxn = 2e5 + 10;
long long k;
long long ans[maxn][maxk];
long long size[maxn][maxk];
long long beitrag[maxn][maxk];
long long bsize[maxn][maxk];
long long cost(long long len) { return (len + k - 1) / k - 2; }
std::vector<long long> v[maxn];
long long tlen = 0;
long long special = 0;
void dfs(long long x, long long p = -1) {
  for (auto next : v[x]) {
    if (next == p) continue;
    dfs(next, x);
    for (long long i = 0; i < k; i++) {
      long long prev = (i - 1 + k) % k;
      beitrag[next][i] = ans[next][prev];
      bsize[next][i] = size[next][prev];
      if (i == 1 || k == 1) beitrag[next][i] += size[next][prev];
      special += beitrag[next][i];
      size[x][i] += bsize[next][i];
      ans[x][i] += beitrag[next][i];
    }
    if (k == 1) {
      beitrag[next][0]++;
      bsize[next][0]++;
      size[x][0]++;
      ans[x][0]++;
    } else {
      beitrag[next][1]++;
      bsize[next][1]++;
      size[x][1]++;
      ans[x][1]++;
    }
    special += 1;
  }
  for (auto next : v[x]) {
    if (next == p) continue;
    for (long long i = 0; i < k; i++) {
      for (long long j = 0; j < k; j++) {
        long long tmpj = ans[x][j] - beitrag[next][j];
        long long tmpsize = (size[x][j] - bsize[next][j]);
        if (tmpsize <= 0 || bsize[next][i] <= 0) continue;
        long long merge = cost(i + j);
        if (merge == -1 && ((i != 0 && j != 0) || (i == 0 && j == 0)))
          tlen += (beitrag[next][i] - bsize[next][i]) * tmpsize +
                  tmpj * bsize[next][i];
        else
          tlen += (beitrag[next][i]) * tmpsize + tmpj * bsize[next][i];
      }
    }
  }
}
int main() {
  std::ios::sync_with_stdio(false);
  long long n;
  std::cin >> n >> k;
  for (long long i = 0; i < n - 1; i++) {
    long long x, y;
    std::cin >> x >> y;
    v[x].push_back(y);
    v[y].push_back(x);
  }
  dfs(1);
  std::cout << special + tlen / 2 << std::endl;
  return 0;
}
