#include <bits/stdc++.h>
using namespace std;
const int N = 5e4 + 10;
const long double pi = acos(-1);
int gi() {
  int x = 0, o = 1;
  char ch = getchar();
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
struct dat {
  long double l, r;
  int id;
  bool operator<(const dat &A) const {
    return l < A.l || (l == A.l && r < A.r);
  }
} q[N];
struct dat2 {
  long double r;
  int id;
  bool operator<(const dat2 &A) const {
    return r < A.r || (r == A.r && id < A.id);
  }
};
int n, m, c[N], tt;
long double x, y, k[N], b[N], ang[N], v[N], ans;
set<dat2> S;
void modify(int p, int v) {
  while (p <= tt) c[p] += v, p += p & -p;
}
int query(int p) {
  int ret = 0;
  while (p) ret += c[p], p -= p & -p;
  return ret;
}
void mdf(dat &l) {
  if (l.l < -pi) l.l += pi * 2;
  if (l.r > pi) l.r -= pi * 2;
  if (l.l > l.r) swap(l.l, l.r);
}
long double sqr(long double x) { return x * x; }
long double dist(long double x1, long double y1, long double x2,
                 long double y2) {
  return sqrt(sqr(x1 - x2) + sqr(y1 - y2));
}
int main() {
  cin >> n >> x >> y >> m;
  x *= 0.001;
  y *= 0.001;
  for (int i = 1; i <= n; i++) {
    k[i] = gi() * 0.001, b[i] = gi() * 0.001;
    ang[i] = atan(k[i]);
    if (k[i] * x + b[i] > y)
      ang[i] += 0.5 * pi;
    else
      ang[i] -= 0.5 * pi;
  }
  long double l = 0, r = 1e10;
  for (int T = 1; T <= 100; T++) {
    long double mid = (l + r) / 2;
    tt = 0;
    int sum = 0;
    memset(c, 0, sizeof(c));
    for (int i = 1; i <= n; i++) {
      long double dis = fabs((k[i] * x - y + b[i]) / sqrt(k[i] * k[i] + 1));
      if (dis > mid) continue;
      dis = acos(dis / mid);
      mdf(q[++tt] = (dat){ang[i] - dis, ang[i] + dis, i});
    }
    for (int i = 1; i <= tt; i++) v[i] = q[i].r;
    sort(q + 1, q + tt + 1);
    sort(v + 1, v + tt + 1);
    for (int i = 1; i <= tt; i++) {
      int L = lower_bound(v + 1, v + tt + 1, q[i].l) - v - 1;
      int R = lower_bound(v + 1, v + tt + 1, q[i].r) - v;
      sum += query(R) - query(L);
      if (sum >= m) break;
      modify(R, 1);
    }
    if (sum >= m)
      r = mid;
    else
      l = mid;
  }
  tt = 0;
  l = max((long double)1e-8, l * (1 + 1e-8));
  for (int i = 1; i <= n; i++) {
    long double dis = fabs((k[i] * x - y + b[i]) / sqrt(k[i] * k[i] + 1));
    if (dis > l) continue;
    dis = acos(dis / l);
    mdf(q[++tt] = (dat){ang[i] - dis, ang[i] + dis, i});
  }
  sort(q + 1, q + tt + 1);
  int cnt = 0;
  for (int i = 1; i <= tt; i++) {
    auto it = S.lower_bound((dat2){q[i].l, 0});
    while (it != S.end() && it->r < q[i].r) {
      int u = it->id, v = q[i].id;
      long double X = (b[v] - b[u]) / (k[u] - k[v]), Y = k[u] * X + b[u];
      ans += dist(x, y, X, Y), ++cnt, ++it;
      if (cnt == m) return printf("%.10Lf\n", ans), 0;
    }
    S.insert((dat2){q[i].r, q[i].id});
  }
  return 0;
}
