#include <bits/stdc++.h>
using namespace std;
template <int POS, class TUPLE>
void deploy(std::ostream &os, const TUPLE &tuple) {}
template <int POS, class TUPLE, class H, class... Ts>
void deploy(std::ostream &os, const TUPLE &t) {
  os << (POS == 0 ? "" : ", ") << get<POS>(t);
  deploy<POS + 1, TUPLE, Ts...>(os, t);
}
template <class... Ts>
std::ostream &operator<<(std::ostream &os, const std::tuple<Ts...> &t) {
  os << "(";
  deploy<0, std::tuple<Ts...>, Ts...>(os, t);
  os << ")";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, std::vector<T> &v) {
  int remain = v.size();
  os << "{";
  for (auto e : v) os << e << (--remain == 0 ? "" : ", ");
  os << "}";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, std::set<T> &v) {
  int remain = v.size();
  os << "{";
  for (auto e : v) os << e << (--remain == 0 ? "" : ", ");
  os << "}";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, std::queue<T> &q) {
  auto qq = q;
  os << "{";
  for (; !qq.empty(); qq.pop()) {
    os << qq.front() << (qq.size() != 1 ? ", " : "");
  }
  os << "}";
  return os;
}
template <class T>
std::ostream &operator<<(std::ostream &os, std::priority_queue<T> &q) {
  auto qq = q;
  os << "{";
  for (; !qq.empty(); qq.pop()) {
    os << qq.top() << (qq.size() != 1 ? ", " : "");
  }
  os << "}";
  return os;
}
template <class T, class K>
std::ostream &operator<<(std::ostream &os, std::pair<T, K> &p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <class T, class K>
std::ostream &operator<<(std::ostream &os, std::map<T, K> &mp) {
  int remain = mp.size();
  os << "{";
  for (auto e : mp)
    os << "(" << e.first << " -> " << e.second << ")"
       << (--remain == 0 ? "" : ", ");
  os << "}";
  return os;
}
template <class T, class K>
std::ostream &operator<<(std::ostream &os, std::unordered_map<T, K> &mp) {
  int remain = mp.size();
  os << "{";
  for (auto e : mp)
    os << "(" << e.first << " -> " << e.second << ")"
       << (--remain == 0 ? "" : ", ");
  os << "}";
  return os;
}
const int64_t MAX = 100500;
const int64_t M = 605;
vector<double> dp[MAX];
inline double recur(int64_t rem, int64_t level) {
  if (rem == 0) return 0;
  level = min(level, M - 5);
  double &res = dp[rem & 1][level];
  if (res != -1) return res;
  res = 0;
  res +=
      level / (level + 1.0) * (recur(rem - 1, level + 0) + level * 0.5 + 0.5);
  res += 1.0 / (level + 1.0) * (recur(rem - 1, level + 1) + level);
  return res;
}
int main() {
  int64_t n, k;
  cin >> n >> k;
  double dat[MAX];
  dp[0] = vector<double>(M, 0);
  dp[1] = vector<double>(M, 0);
  for (int64_t i = 0; i < ((int64_t)(MAX - 5)); ++i) {
    int64_t index = 1 - (i & 1);
    for (int64_t j = 0; j < ((int64_t)(M)); ++j) dp[index][j] = -1;
    for (int64_t l = 0; l < ((int64_t)(M)); ++l) recur(i + 1, l);
    dat[i] = dp[i & 1][1];
  }
  if (k == 1) {
    printf("%0.20lf\n", (double)dat[n]);
    return 0;
  }
  double ans = 0;
  double in = log(1.0 / k);
  double out = log((k - 1.0) / k);
  double bef_total = log(1.0);
  for (int64_t t = 0; t <= n; ++t) {
    double total = bef_total;
    total += in * t;
    total += out * (n - t);
    ans += exp(total) * dat[t];
    bef_total += log(n - t);
    bef_total -= log(t + 1);
  }
  printf("%0.20lf\n", (double)ans * k);
}
