#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const double eps = 1e-10;
int rd() {
  int x = 0, w = 1;
  char ch = 0;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + (ch ^ 48);
    ch = getchar();
  }
  return x * w;
}
int n, m, nn, t, a[N], ps[N][2], sm[N], st[N], va[N];
bool cmp(int aa, int bb) {
  return ps[aa][1] - ps[aa][0] < ps[bb][1] - ps[bb][0];
}
bool cmp2(int aa, int bb) { return va[aa] > va[bb]; }
int ft[N];
int fdf(int x) { return ft[x] == x ? x : ft[x] = fdf(ft[x]); }
double sx, sy, li[N][2], ds[N], pa[N], pb[N];
double sq(double x) { return x * x; }
struct BIT {
  int bt[N];
  void clr() { memset(bt, 0, sizeof(int) * (t + 1)); }
  void add(int x, int y) {
    while (x <= t) bt[x] += y, x += x & (-x);
  }
  int gsm(int x) {
    int an = 0;
    while (x) an += bt[x], x -= x & (-x);
    return an;
  }
} b1;
vector<int> ap[N];
long long ck(double mid, bool fg) {
  t = 0;
  for (int i = 1; i <= n; ++i) {
    if (ds[i] > mid + eps) continue;
    double za = sq(li[i][0]) + 1, zb = 2 * (li[i][0] * (li[i][1] - sy) - sx),
           zc = sq(sx) + sq(li[i][1] - sy) - sq(mid), xx, yy,
           zz = sqrt(sq(zb) - 4 * za * zc);
    xx = (-zb + zz) / (2 * za), yy = li[i][0] * xx + li[i][1];
    pa[++t] = atan2(yy - sy, xx - sx) * 1e10;
    xx = (-zb - zz) / (2 * za), yy = li[i][0] * xx + li[i][1];
    pa[++t] = atan2(yy - sy, xx - sx) * 1e10;
    if (fg) a[t / 2] = i;
  }
  memcpy(pb, pa, sizeof(double) * (t + 1));
  sort(pb + 1, pb + t + 1);
  int lt = t;
  nn = t / 2, t = 0;
  for (int i = 1; i <= lt; ++i)
    if (i == 1 || fabs(pb[i] - pb[i - 1]) > eps) pb[++t] = pb[i];
  pb[t + 1] = 233e10;
  b1.clr(), memset(sm, 0, sizeof(int) * (t + 1));
  for (int i = 1; i <= t; ++i) ap[i].clear();
  for (int i = 1; i <= nn; ++i) {
    ps[i][0] = upper_bound(pb + 1, pb + t + 2, pa[2 * i - 1]) - pb - 1;
    ps[i][1] = upper_bound(pb + 1, pb + t + 2, pa[2 * i]) - pb - 1;
    if (ps[i][0] > ps[i][1]) swap(ps[i][0], ps[i][1]);
    if (fg) {
      ap[ps[i][0]].push_back(i), ap[ps[i][1]].push_back(i);
      continue;
    }
    ap[ps[i][1]].push_back(i);
    ++sm[ps[i][0]];
    if (ps[i][0] < ps[i][1]) ++sm[ps[i][1]];
  }
  if (fg) return 0;
  for (int i = 1; i <= t; ++i) sm[i] += sm[i - 1];
  long long ns = 0;
  for (int i = 1; i <= t; ++i) {
    int nn = ap[i].size();
    for (int j = 0; j < nn; ++j) {
      int x = ap[i][j];
      ns += max(sm[ps[x][1] - 1] - sm[ps[x][0]], 0) -
            2 * max(b1.gsm(ps[x][1] - 1) - b1.gsm(ps[x][0]), 0);
      b1.add(ps[x][0], 1);
    }
  }
  ns /= 2;
  for (int i = t; i; --i) {
    sm[i] -= sm[i - 1];
    ns += 1ll * sm[i] * (sm[i] - 1) / 2;
  }
  return ns;
}
int main() {
  n = rd(), sx = (double)rd() / 1000, sy = (double)rd() / 1000, m = rd();
  for (int i = 1; i <= n; ++i) {
    li[i][0] = (double)rd() / 1000, li[i][1] = (double)rd() / 1000;
    if (fabs(li[i][0]) > eps) {
      double nk = (double)(-1) / li[i][0], nb = sy - sx * nk;
      double nx = (li[i][1] - nb) / (nk - li[i][0]), ny = nk * nx + nb;
      ds[i] = sqrt(sq(sx - nx) + sq(sy - ny));
    } else
      ds[i] = fabs(sy - li[i][1]);
  }
  double l = 0, r = 1e10;
  int rs = 100;
  while (r - l > eps) {
    if ((--rs) < 0) break;
    double mid = (l + r) / 2;
    if (ck(mid, 0) >= m)
      r = mid;
    else
      l = mid;
  }
  ck(r, 1);
  for (int i = 0; i <= t + 1; ++i) ft[i] = i;
  for (int i = 1; i <= nn; ++i) st[i] = i;
  sort(st + 1, st + nn + 1, cmp);
  for (int i = 1; i <= nn; ++i) va[st[i]] = i;
  for (int i = 1; i <= t; ++i) sort(ap[i].begin(), ap[i].end(), cmp2);
  double ans = 0, pz = 0;
  for (int i = 1; i <= nn; ++i) {
    int x = st[i], np = fdf(ps[x][1] - 1);
    while (np > ps[x][0]) {
      int mm = ap[np].size();
      for (int j = 0; j < mm; ++j) {
        int y = ap[np][j];
        double nx = (li[a[y]][1] - li[a[x]][1]) / (li[a[x]][0] - li[a[y]][0]),
               ny = li[a[x]][0] * nx + li[a[x]][1];
        ans += sqrt(sq(sx - nx) + sq(sy - ny)), pz += 1;
      }
      np = fdf(np - 1);
    }
    if (ap[ps[x][0]].size() == 1) ft[ps[x][0]] = ps[x][0] - 1;
    ap[ps[x][0]].pop_back();
    if (ap[ps[x][1]].size() == 1) ft[ps[x][1]] = ps[x][1] - 1;
    ap[ps[x][1]].pop_back();
    if (pz > m + m) break;
  }
  ans += (m - pz) * r;
  if (fabs(r) < eps) ans = 0;
  printf("%.8lf\n", ans);
  return 0;
}
