#include <bits/stdc++.h>
using namespace std;
class Line {
 private:
  long double m, b;

 public:
  Line(long double m, long double b) : m(m), b(b) {}
  long double slope() { return m; }
  long double& yIntercept() { return b; }
  pair<long double, long double> intersect(Line other) {
    long double x = (this->b - other.yIntercept()) / (other.slope() - this->m);
    long double y = (this->m) * x + this->b;
    return make_pair(x, y);
  }
  double getY(long double x) { return m * x + b; }
};
int main(int argc, char* argv[]) {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int N, K;
  cin >> N >> K;
  vector<int> T;
  T.reserve(N);
  for (int i = 0; i < N; ++i) {
    int t;
    cin >> t;
    T.push_back(t);
  }
  vector<long long> S;
  S.reserve(N);
  vector<long double> R;
  R.reserve(N);
  S.push_back(T.front());
  R.push_back(1.0 / T.front());
  for (int n = 1; n < N; ++n) {
    S.push_back(S.back() + T[n]);
    R.push_back(R.back() + 1.0L / T[n]);
  }
  vector<vector<long double>> eV(K, vector<long double>(N));
  eV.front().front() = 1;
  for (int n = 1; n < N; ++n) {
    eV[0][n] = eV[0][n - 1] + ((long double)S[n]) / T[n];
  }
  vector<pair<long double, Line>> convexHull;
  convexHull.reserve(N);
  for (int k = 1; k < K; ++k) {
    convexHull.clear();
    int cursor = 0;
    for (int n = k; n < N; ++n) {
      long double slope = -S[n - 1];
      long double yIntercept =
          eV[k - 1][n - 1] - eV[0][n - 1] + S[n - 1] * R[n - 1];
      Line l(slope, yIntercept);
      while (convexHull.size() > 1 &&
             convexHull.back().first >=
                 l.intersect(convexHull[convexHull.size() - 2].second).first) {
        convexHull.pop_back();
      }
      if (convexHull.size() == 1 &&
          l.yIntercept() <= convexHull.back().second.yIntercept())
        convexHull.pop_back();
      convexHull.emplace_back(
          convexHull.empty() ? 0 : l.intersect(convexHull.back().second).first,
          l);
      if (cursor >= convexHull.size()) cursor = convexHull.size() - 1;
      cursor = upper_bound(convexHull.begin() + cursor, convexHull.end(), R[n],
                           [](long double x, pair<long double, Line> l) {
                             return x < l.first;
                           }) -
               convexHull.begin();
      --cursor;
      eV[k][n] = eV[0][n] + convexHull[cursor].second.getY(R[n]);
    }
  }
  cout << fixed;
  cout << setprecision(10);
  cout << eV.back().back() << endl;
  return 0;
}
