#include <bits/stdc++.h>
using namespace std;
struct ConvexHull {
  int lastIndex;
  ConvexHull() { lastIndex = 0; }
  vector<pair<long double, long long> > lines;
  vector<long double> x;
  void addLine(long double b, long long k) {
    if (lines.size() == 0) {
      lines.push_back(make_pair(b, k));
      return;
    }
    long double xx = (b - lines.back().first) / (lines.back().second - k);
    while (lines.size() != 1) {
      if (xx > x.back()) {
        lines.pop_back();
        x.pop_back();
        xx = (b - lines.back().first) / (lines.back().second - k);
      } else {
        break;
      }
    }
    lines.push_back(make_pair(b, k));
    x.push_back(xx);
  }
  long double intersect(long double p) {
    if (lines.size() == 1) {
      lastIndex = 0;
    } else if (p < x.back()) {
      lastIndex = x.size();
    } else {
      while (p < x[lastIndex]) {
        ++lastIndex;
      }
    }
    return lines[lastIndex].first + lines[lastIndex].second * p;
  }
};
int main() {
  int n, k;
  scanf("%d %d", &n, &k);
  vector<int> t(n);
  for (int i = 0; i < n; ++i) {
    scanf("%d", &t[i]);
  }
  vector<long long> superSums(n + 1, 0);
  vector<long double> inverseSums(n + 1, 0);
  vector<long double> strangeSums(n + 1, 0);
  for (int i = n - 1; i >= 0; --i) {
    superSums[i] = superSums[i + 1] + t[i];
    inverseSums[i] = inverseSums[i + 1] + 1.0l / t[i];
    strangeSums[i] = strangeSums[i + 1] + t[i] * inverseSums[i];
  }
  vector<vector<long double> > dp(k, vector<long double>(n + 1, 0));
  for (int i = 1; i <= n; ++i) {
    dp[0][i] = dp[0][i - 1] + 1.0l * (superSums[0] - superSums[i]) / t[i - 1];
  }
  for (int l = 1; l < k; ++l) {
    ConvexHull hull;
    hull.addLine(dp[l - 1][l] + strangeSums[l], -superSums[l]);
    for (int j = l + 1; j <= n; ++j) {
      dp[l][j] = hull.intersect(inverseSums[j]) +
                 superSums[j] * inverseSums[j] - strangeSums[j];
      hull.addLine(dp[l - 1][j] + strangeSums[j], -superSums[j]);
    }
  }
  printf("%.10lf\n", (double)dp[k - 1][n]);
  return 0;
}
