#include <bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
int n, m;
int tr[101000];
struct data {
  long double a, b;
  bool tag;
  long double k, d;
} line[101000];
struct cmp4 {
  bool operator()(const data& a, const data& b) { return a.b < b.b; }
};
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 1) + (x << 3) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
long double lsh[101000 * 2];
inline int cmp(long double x) {
  if (fabs(x) <= 1e-20)
    return 0;
  else if (x < 0)
    return -1;
  else
    return 1;
}
inline bool cmp1(long double x, long double y) { return cmp(x - y) < 0; }
inline bool cmp2(long double x, long double y) { return cmp(x - y) == 0; }
inline bool cmp3(data x, data y) { return cmp(x.a - y.a) < 0; }
inline void cir(long double r) {
  int cnt = 0;
  for (register int i = 1; i <= n; i++) {
    long double a = line[i].k, b = line[i].d;
    long double del = 4 * a * a * b * b - 4 * (a * a + 1) * (b * b - r * r);
    line[i].tag = 0;
    if (cmp(del) < 0) continue;
    del = sqrt(del);
    long double x1 = (-2 * a * b - del) / (2 * (a * a + 1)),
                x2 = (-2 * a * b + del) / (2 * (a * a + 1));
    long double y1 = a * x1 + b, y2 = a * x2 + b;
    lsh[++cnt] = atan2(y1, x1);
    line[i].a = lsh[cnt];
    lsh[++cnt] = atan2(y2, x2);
    line[i].b = lsh[cnt];
    line[i].tag = 1;
    if (line[i].a > line[i].b) swap(line[i].a, line[i].b);
  }
  sort(lsh + 1, lsh + 1 + cnt, cmp1);
  cnt = unique(lsh + 1, lsh + 1 + cnt, cmp2) - lsh - 1;
  for (int i = 1; i <= n; i++) {
    if (!line[i].tag) continue;
    line[i].a = lower_bound(lsh + 1, lsh + 1 + cnt, line[i].a, cmp1) - lsh;
    line[i].b = lower_bound(lsh + 1, lsh + 1 + cnt, line[i].b, cmp1) - lsh;
  }
  sort(line + 1, line + 1 + n, cmp3);
}
inline int lb(int x) { return x & (-x); }
int ask(int x) {
  int ans = 0;
  for (int i = x; i; i -= lb(i)) ans += tr[i];
  return ans;
}
void upd(int pos, int x) {
  for (int i = pos; i <= 2 * n; i += lb(i)) tr[i] += x;
}
inline bool check(long double r) {
  cir(r);
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    if (!line[i].tag) continue;
    ans += ask(line[i].b) - ask(line[i].a - 1);
    upd(line[i].b, 1);
  }
  memset(tr, 0, sizeof(tr));
  return ans >= m;
}
multiset<data, cmp4> q;
inline long double dis(data a, data b) {
  long double x = (b.d - a.d) / (a.k - b.k), y = a.k * x + a.d;
  return sqrt(x * x + y * y);
}
void out(long double r) {
  cir(r);
  long double ans = 0;
  int cnt = 0;
  for (register int i = 1; i <= n; i++) {
    if (!line[i].tag) continue;
    int tmp = line[i].b;
    line[i].b = line[i].a;
    multiset<data, cmp4>::iterator fir = q.upper_bound(line[i]);
    line[i].b = tmp;
    while (fir != q.end()) {
      if ((*fir).b >= line[i].b) break;
      if ((*fir).a == line[i].a) {
        fir++;
        continue;
      }
      cnt++;
      ans += dis(line[i], *fir);
      fir++;
    }
    q.insert(line[i]);
  }
  ans += r * (m - cnt);
  cout << fixed << setprecision(10) << ans << endl;
}
int main() {
  int p = 0;
  long double x, y;
  n = read(), x = read(), y = read(), m = read();
  if (x == 0) {
    cout << 0.000000 << endl;
    return 0;
  }
  x /= 1000.0, y /= 1000.0;
  for (int i = 1; i <= n; i++) {
    long double a = read(), b = read();
    line[i].k = a / 1000.0, line[i].d = b / 1000.0 + line[i].k * x - y;
  }
  long double l = 0, r = 1e10;
  for (int i = 1; i <= 90; i++) {
    long double mid = (l + r) / 2.0;
    if (check(mid))
      r = mid;
    else
      l = mid;
  }
  out(r);
  return 0;
}
