#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
double m[N], b[N], k[N];
struct cht {
  int ptr = 0, idx = 0;
  bool bad(int l1, int l2, int l3) {
    return 1.0 * (b[l3] - b[l1]) * (m[l1] - m[l2]) <=
           1.0 * (b[l2] - b[l1]) * (m[l1] - m[l3]);
  }
  void add(double _m, double _b, int _k) {
    m[idx] = _m, b[idx] = _b, k[idx] = _k;
    idx++;
    while (idx >= 3 && bad(idx - 3, idx - 2, idx - 1)) {
      m[idx - 2] = m[idx - 1];
      b[idx - 2] = b[idx - 1];
      k[idx - 2] = k[idx - 1];
      --idx;
    }
  }
  double f(int i, double x) { return m[i] * x + b[i]; }
  pair<double, int> query(double x) {
    if (ptr >= idx) ptr = idx - 1;
    while (ptr < idx - 1 && f(ptr, x) > f(ptr + 1, x)) ptr++;
    return {f(ptr, x), k[ptr]};
  }
  void clear() { ptr = idx = 0; }
} ds;
double p[N], f[N], r[N];
pair<double, int> dp[N];
int n, K;
pair<double, int> get(double C) {
  ds.clear();
  ds.add(0, 0, 0);
  for (int i = 1; i <= n; ++i) {
    pair<double, int> tmp = ds.query(r[i]);
    dp[i].first = tmp.first + f[i] + C;
    dp[i].second = tmp.second + 1;
    if (i < n) ds.add(-p[i], dp[i].first - f[i] + r[i] * p[i], dp[i].second);
  }
  return dp[n];
}
int main(int argc, char const *argv[]) {
  scanf("%d %d", &n, &K);
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    p[i] = p[i - 1] + x;
    r[i] = r[i - 1] + 1.0 / (double)x;
    f[i] = f[i - 1] + p[i] / x;
  }
  double lo = 0, hi = p[n] * 1e5 + 100;
  int l = 0, r = n + 1;
  double lval, rval;
  while (fabs(hi - lo) > 1e-2) {
    double mid = (lo + hi) / 2;
    pair<double, int> tmp = get(mid);
    if (tmp.second == K) {
      double ans = tmp.first - K * mid;
      printf("%.10f\n", ans);
      return 0;
    }
    if (tmp.second < K)
      hi = mid;
    else
      lo = mid;
  }
  double ans = get(hi).first - hi * K;
  printf("%.10f\n", ans);
}
