#include <bits/stdc++.h>
using namespace std;
struct line {
  double m, b;
  double evaluate(double x) { return m * x + b; }
};
struct dp_coonvex_hull {
  int tail, head;
  vector<line> lines;
  dp_coonvex_hull(int n) : tail(0), head(0), lines(n) {}
  bool bad_lines(line l1, line l2, line l3) {
    return (l2.b - l1.b) * (l1.m - l3.m) >= (l3.b - l1.b) * (l1.m - l2.m);
  }
  void insert(double m, double b) {
    line l = {m, b};
    while (tail - head >= 2 && bad_lines(lines[tail - 2], lines[tail - 1], l))
      tail--;
    lines[tail++] = l;
  }
  double query(double x) {
    while (tail - head >= 2 &&
           lines[head].evaluate(x) >= lines[head + 1].evaluate(x))
      head++;
    return lines[head].evaluate(x);
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<double> p(n + 1), r(n + 1), s(n + 1);
  vector<vector<double>> dp(k + 1, vector<double>(n + 1, 1e32));
  for (int i = 1; i <= n; i++) {
    double t;
    cin >> t;
    s[i] = s[i - 1] + t;
    r[i] = r[i - 1] + 1.0 / t;
    p[i] = p[i - 1] + s[i] / t;
  }
  for (int i = 1; i <= n; i++) dp[1][i] = p[i];
  for (int i = 2; i <= k; i++) {
    dp_coonvex_hull hull(n + 1);
    dp[i][0] = 1e32;
    for (int j = 1; j <= n; j++) {
      dp[i][j] = hull.query(r[j]) + p[j];
      hull.insert(-s[j], dp[i - 1][j] - p[j] + r[j] * s[j]);
    }
  }
  cout.precision(12);
  cout << fixed << dp[k][n] << '\n';
  return 0;
}
