#include <bits/stdc++.h>
template <class T>
void read(T &x) {
  int f = 1;
  char c = getchar();
  x = 0;
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  x *= f;
}
template <class T>
void write(T x) {
  int len = 0;
  char s[30];
  if (x < 0) putchar('-'), x = -x;
  do {
    s[++len] = x % 10;
    x /= 10;
  } while (x);
  while (len) putchar(s[len--] + '0');
}
template <class T>
inline bool gmin(T &a, T b) {
  return a > b ? a = b, true : false;
}
template <class T>
inline bool gmax(T &a, T b) {
  return a < b ? a = b, true : false;
}
const int maxn = 1e5 + 5;
int n, m, k;
int pre, cur;
double *f[2];
int main() {
  read(n);
  read(k);
  m = std::min(n, 700);
  f[0] = new double[m + 5];
  f[1] = new double[m + 5];
  for (int i = 1; i <= m + 1; i++) f[0][i] = 0.0;
  pre = 1;
  cur = 0;
  for (int i = 1; i <= n; i++) {
    pre ^= 1;
    cur ^= 1;
    for (int j = 1; j <= m; j++) {
      double sum0 = ((f[pre][j] + (j + 1) / 2.0) * j / (j + 1) +
                     (f[pre][j + 1] + j) / (j + 1)) /
                    k;
      double sum1 = f[pre][j] * (k - 1) / k;
      f[cur][j] = sum0 + sum1;
    }
    f[cur][m + 1] = 0.0;
  }
  printf("%.10lf\n", f[cur][1] * k);
  return 0;
}
