#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
struct cht {
  vector<long double> m, b;
  int ptr = 0;
  bool bad(int l1, int l2, int l3) {
    return 1.0 * (b[l3] - b[l1]) * (m[l1] - m[l2]) <=
           1.0 * (b[l2] - b[l1]) * (m[l1] - m[l3]);
  }
  void add(long double _m, long double _b) {
    m.push_back(_m);
    b.push_back(_b);
    int s = m.size();
    while (s >= 3 && bad(s - 3, s - 2, s - 1)) {
      s--;
      m.erase(m.end() - 2), b.erase(b.end() - 2);
    }
  }
  long double f(int i, long double x) { return m[i] * x + b[i]; }
  long double query(long double x) {
    if (ptr >= m.size()) ptr = m.size() - 1;
    while (ptr < m.size() - 1 && f(ptr, x) > f(ptr + 1, x)) ptr++;
    return f(ptr, x);
  }
  void clear() { m.clear(), b.clear(), ptr = 0; }
} ds;
const int N = 2e5 + 10;
long double p[N], f[N], r[N];
long double dp[51][N];
int main(int argc, char const *argv[]) {
  int n, K;
  scanf("%d %d", &n, &K);
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    p[i] = p[i - 1] + x;
    r[i] = r[i - 1] + 1.0 / (long double)x;
    f[i] = f[i - 1] + p[i] / x;
  }
  for (int i = 1; i <= n; i++) dp[1][i] = f[i];
  for (int k = 2; k <= K; ++k) {
    ds.clear();
    ds.add(0, 0);
    for (int i = 1; i <= n; ++i) {
      dp[k][i] = ds.query(r[i]) + f[i];
      ds.add(-p[i], dp[k - 1][i] - f[i] + r[i] * p[i]);
    }
  }
  cout << fixed << setprecision(8) << dp[K][n] << endl;
}
