#include <bits/stdc++.h>
using namespace std;
double dp[200020][51];
int n, k, t[200020];
double acum_num[200020], acum_denom[200020], pref[200020];
double C(int l, int r) {
  if (l == 0) return pref[r];
  return pref[r] - pref[l - 1] -
         acum_num[l - 1] * (acum_denom[r] - acum_denom[l - 1]);
}
struct func {
  double a, b;
  func() {}
  func(double a, double b) : a(a), b(b) {}
  double y(double x) { return a * x + b; }
  double intersec(func o) { return (o.b - b) / (a - o.a); }
};
struct CHT {
  deque<func> cht;
  bool bad(func a, func b, func c) { return a.intersec(c) <= a.intersec(b); }
  void add(func f) {
    while (cht.size() > 1 && bad(cht[cht.size() - 2], cht.back(), f)) {
      cht.pop_back();
    }
    cht.push_back(f);
  }
  double query(double x) {
    while (cht.size() > 1 && cht[0].y(x) >= cht[1].y(x)) cht.pop_front();
    return cht.front().y(x);
  }
};
CHT resp[51];
int main() {
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; i++) scanf("%d", &t[i]);
  for (int i = 1; i <= n; i++) {
    acum_num[i] = acum_num[i - 1] + t[i];
    acum_denom[i] = acum_denom[i - 1] + 1.0 / t[i];
    pref[i] = pref[i - 1] + acum_num[i] / t[i];
  }
  resp[0].add(func(0, 0));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= (min(i, k)); j++) {
      dp[i][j] = pref[i] + resp[j - 1].query(acum_denom[i]);
      resp[j].add(
          func(-acum_num[i], dp[i][j] - pref[i] + acum_num[i] * acum_denom[i]));
    }
  }
  printf("%.9f\n", dp[n][k]);
  return 0;
}
