#include <bits/stdc++.h>
using namespace std;
const long long N(200000), INF(1e9);
long long n, k, h, t, now(1), a[N + 5], s[N + 5], q[N + 5];
long double c[N + 5], d[N + 5], dp[2][N + 5], w[1000][1000];
inline void read(long long &x) {
  long long f(1);
  char c = getchar();
  x = 0;
  while (c < '0' || '9' < c) {
    if (c == '-') f = 0;
    c = getchar();
  };
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getchar();
  x = f ? x : -x;
}
inline long long X(long long x) { return s[x]; }
inline long double Y(long long x) { return dp[now][x] - c[x] + s[x] * d[x]; }
inline long double K(long long x) { return d[x]; }
inline long double slope(long long x, long long y) {
  return (Y(x) - Y(y)) / (X(x) - X(y));
}
signed main() {
  read(n), read(k);
  for (register long long i(1); i <= n; ++i) read(a[i]);
  for (register long long i(1); i <= n; ++i) s[i] = s[i - 1] + a[i];
  for (register long long i(1); i <= n; ++i)
    c[i] = c[i - 1] + 1.0 * s[i] / a[i];
  for (register long long i(1); i <= n; ++i) d[i] = d[i - 1] + 1.0 / a[i];
  for (register long long i(1); i <= n; ++i) dp[1][i] = c[i];
  for (register long long i(2), p; i <= k; ++i, now ^= 1) {
    p = i & 1, q[h = t = 1] = 0;
    for (register long long j(1); j <= n; ++j) {
      while (h < t && slope(q[h], q[h + 1]) < K(j)) ++h;
      dp[p][j] = dp[now][q[h]] + c[j] - c[q[h]] - s[q[h]] * (d[j] - d[q[h]]);
      while (h < t && slope(q[t - 1], q[t]) >= slope(q[t], j)) --t;
      q[++t] = j;
    }
  }
  printf("%.10Lf\n", dp[k & 1][n]);
  return 0;
}
