#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:536870912")
const int MOD = 1000000007;
const int INF = 1000000001;
const int MAXN = 100010;
const long double EPS = 1e-8;
const int HASH_POW = 29;
const long double PI = acos(-1.0);
using namespace std;
void my_return(int code) { exit(code); }
int n, k, t[200010];
long double pre[200010], sum[200010], rev[200010];
long double dp[2][200010];
struct line {
  long double k, l;
} lst[200010];
int st[200010], ptr = 0;
long double val(int id, long double pt) { return lst[id].k * pt + lst[id].l; }
void update_line(int id, int layer) {
  lst[id].k = -sum[id];
  lst[id].l = dp[layer][id] - pre[id] + rev[id] * sum[id];
}
long double intersect(int id1, int id2) {
  return (lst[id2].l - lst[id1].l) / (lst[id1].k - lst[id2].k);
}
void add_line(int id) {
  while (ptr > 1) {
    int id1 = st[ptr - 1];
    int id2 = st[ptr - 2];
    long double pt1 = intersect(id1, id2);
    long double pt2 = intersect(id, id1);
    if (pt1 < pt2)
      break;
    else
      --ptr;
  }
  st[ptr++] = id;
}
int main() {
  cin.sync_with_stdio(0);
  cin.tie(0);
  mt19937 mt_rand(time(0));
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; ++i) scanf("%d", &t[i]);
  for (int i = 1; i <= n; ++i) {
    sum[i] = sum[i - 1] + t[i];
    rev[i] = rev[i - 1] + 1.0 / t[i];
    pre[i] = pre[i - 1] + sum[i] / t[i];
  }
  for (int i = 1; i <= n; ++i) dp[1][i] = pre[i];
  for (int i = 2; i <= k; ++i) {
    ptr = 0;
    update_line(i - 1, (i - 1) & 1);
    add_line(i - 1);
    for (int j = i; j <= n; ++j) {
      int ll = -1, rr = ptr - 1;
      while (ll + 1 < rr) {
        int mid = (ll + rr) / 2;
        long double pt1 = intersect(st[mid], st[mid + 1]);
        if (rev[j] >= pt1)
          ll = mid;
        else
          rr = mid;
      }
      dp[i & 1][j] = val(st[rr], rev[j]) + pre[j];
      update_line(j, (i - 1) & 1);
      add_line(j);
    }
  }
  printf("%.10lf\n", double(dp[k & 1][n]));
  my_return(0);
}
