#include <bits/stdc++.h>
#pragma GCC optimize("03")
using namespace std;
const int N = 2e5 + 5;
long double tok[N], rec[N];
namespace TwoPointers {
const bool B = 0;
long double state, sum, inv;
int l, r;
void init() {
  l = B;
  r = B - 1;
  state = sum = inv = 0.0L;
}
void add(int i, bool right) {
  inv += rec[i];
  sum += tok[i];
  if (right) {
    state += sum / tok[i];
  } else {
    state += tok[i] * inv;
  }
}
void remove(int i, bool right) {
  if (right) {
    state -= sum / tok[i];
  } else {
    state -= tok[i] * inv;
  }
  inv -= rec[i];
  sum -= tok[i];
}
long double query(int ql, int qr) {
  while (l > ql) add(--l, 0);
  while (r < qr) add(++r, 1);
  while (l < ql) remove(l++, 0);
  while (r > qr) remove(r--, 1);
  return state;
}
};  // namespace TwoPointers
bool pre, cur;
long double dp[2][N];
inline long double cost(int l, int r) { return TwoPointers::query(l, r); }
void solve(int l, int r, int pl, int pr) {
  if (r < l) return;
  int m = l + r >> 1;
  pair<long double, int> opt;
  opt.first = numeric_limits<long double>::max();
  for (int i = pl; i <= pr; i++) {
    if (i > m) break;
    opt = min(opt, {dp[pre][i - 1] + cost(i, m), i});
  }
  dp[cur][m] = opt.first;
  solve(l, m - 1, pl, opt.second);
  solve(m + 1, r, opt.second, pr);
}
long double solve(int n, int k) {
  TwoPointers::init();
  cur = 0, pre = 1;
  for (int i = 0; i < n; i++) dp[cur][i] = cost(0, i);
  for (int i = 1; i < k; i++) {
    swap(cur, pre);
    solve(i, n - 1, i, n - 1);
  }
  return dp[cur][n - 1];
}
int main() {
  int n, k;
  scanf("%d %d", &n, &k);
  for (int i = 0; i < n; i++) {
    int x;
    scanf("%d", &x);
    tok[i] = x;
    rec[i] = 1.0L / tok[i];
  }
  printf("%.4Lf\n", solve(n, k));
}
