#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const long double E = 1e-9;
unsigned char ccc;
bool _minus = false;
inline void read(int &n) {
  n = 0;
  _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n') break;
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus) n *= -1;
}
char wwww[12];
int kkkk;
inline void write(int x) {
  kkkk = 0;
  if (!x) ++kkkk, wwww[kkkk] = '0';
  while (x) {
    ++kkkk;
    wwww[kkkk] = char(x % 10 + '0');
    x /= 10;
  }
  for (int i = kkkk; i >= 1; --i) putchar(wwww[i]);
  putchar(' ');
}
template <typename T>
inline T sqr(T t) {
  return t * t;
}
const int MAX = 2e5 + 1;
const int MAX2 = 51;
long double dp[MAX2][MAX];
long double ar[MAX];
long double pref1[MAX], pref2[MAX], pref3[MAX];
int pointer;
vector<long double> M;
vector<long double> B;
inline bool bad(int l1, int l2, int l3) {
  return (B[l3] - B[l1]) * (M[l1] - M[l2]) > (B[l2] - B[l1]) * (M[l1] - M[l3]);
}
inline void add(long double m, long double b) {
  M.push_back(m);
  B.push_back(b);
  while ((int)M.size() >= 3 && bad(M.size() - 3, M.size() - 2, M.size() - 1)) {
    M.erase(M.end() - 2);
    B.erase(B.end() - 2);
  }
  assert(M.size() == B.size());
}
int pos;
inline long double query(long double x) {
  if (pos >= (int)M.size()) pos = M.size() - 1;
  while (pos < (int)M.size() - 1 &&
         M[pos + 1] * x + B[pos + 1] < M[pos] * x + B[pos])
    pos++;
  assert(!M.empty());
  return M[pos] * x + B[pos];
}
inline void clear() {
  M.clear();
  B.clear();
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  srand(time(NULL));
  cout.precision(15);
  cout << fixed;
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    cin >> ar[i];
    pref1[i] = pref1[i - 1] + ar[i];
    pref2[i] = pref2[i - 1] + 1.0 / ar[i];
    pref3[i] = pref3[i - 1] + (pref1[i] / ar[i]);
  }
  memset(dp, 0, sizeof(dp));
  for (int i = 1; i <= n; i++) {
    dp[1][i] = dp[1][i - 1] + pref1[i] / ar[i];
  }
  for (int j = 2; j <= k; j++) {
    clear();
    for (int i = j - 1; i < j; i++) {
      add(pref1[i], dp[j - 1][i] - pref3[i] + pref2[i] * pref1[i]);
    }
    for (int i = j; i <= n; i++) {
      dp[j][i] = query(-pref2[i]) + pref3[i];
      add(pref1[i], dp[j - 1][i] - pref3[i] + pref2[i] * pref1[i]);
    }
  }
  cout << dp[k][n] << "\n";
}
