#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 7;
const int maxn = 2e5 + 5;
const int maxk = 55;
int n, k;
double t[maxn];
double sum[maxn], f[maxn], g[maxn];
double dp[maxn][maxk];
class Line {
 public:
  double k, b;
  Line() {}
  Line(double _k, double _b) : k(_k), b(_b) {}
};
inline double inter(Line &l1, Line &l2) {
  return (l2.b - l1.b) / (l1.k - l2.k);
}
class ConvexHull {
 public:
  int top;
  Line stk[maxn];
  inline void clear() {
    top = 0;
    return;
  }
  inline void insert(Line l) {
    for (;
         top >= 2 && inter(stk[top - 1], stk[top - 2]) > inter(stk[top - 2], l);
         --top)
      ;
    stk[top++] = l;
    return;
  }
  inline Line query(double x, int &ptr) {
    for (; ptr + 1 < top && inter(stk[ptr], stk[ptr + 1]) <= x; ++ptr)
      ;
    return stk[ptr];
  }
} con;
int main() {
  scanf("%d%d", &n, &k);
  for (int i = (1); i <= (n); ++i) {
    scanf("%lf", t + i);
    sum[i] = sum[i - 1] + t[i];
    f[i] = f[i - 1] + sum[i] / t[i];
    g[i] = g[i - 1] + 1.0 / t[i];
  }
  for (int j = (1); j <= (k); ++j) {
    int ptr = 0;
    con.clear();
    if (j == 1) con.insert(Line(0, 0));
    for (int i = (j); i <= (n); ++i) {
      con.insert(Line(-sum[i - 1],
                      sum[i - 1] * g[i - 1] + dp[i - 1][j - 1] - f[i - 1]));
      Line l = con.query(g[i], ptr);
      dp[i][j] = l.k * g[i] + l.b + f[i];
    }
  }
  printf("%.10lf\n", dp[n][k]);
  return 0;
}
