#include <bits/stdc++.h>
using namespace std;
const int maxn = 50010 << 1;
const long double eps = 1e-12;
struct point {
  long double x, y, alp;
  bool operator<(const point &o) const { return alp + eps < o.alp; }
} o, p[maxn << 1];
int n, m;
long double a[maxn], b[maxn];
int tot = 0, loc[maxn << 1], pos[maxn << 1], seq[maxn << 1];
int tr[maxn << 1], line[maxn << 1];
long double sqr(long double x) { return x * x; }
void read(long double &v) {
  double tmp;
  scanf("%lf", &tmp);
  v = (long double)tmp / (long double)1000;
}
bool cmp1(int a, int b) { return p[a] < p[b]; }
bool cmp2(int a, int b) { return pos[a] < pos[b]; }
void prep(long double D) {
  tot = 0;
  for (int i = 1; i <= n; i++) {
    long double A = 1 + sqr(a[i]);
    long double B = -2 * o.x + 2 * (b[i] - o.y) * a[i];
    long double C = sqr(o.x) + sqr(o.y - b[i]) - sqr(D);
    long double delt = B * B - 4 * A * C;
    if (delt < eps) continue;
    delt = sqrtl(delt);
    long double x1 = (-B + delt) / (2 * A);
    long double x2 = (-B - delt) / (2 * A);
    long double y1 = a[i] * x1 + b[i];
    long double y2 = a[i] * x2 + b[i];
    p[tot] = (point){x1, y1};
    p[tot++].alp = atan2l(y1 - o.y, x1 - o.x);
    p[tot] = (point){x2, y2};
    p[tot++].alp = atan2l(y2 - o.y, x2 - o.x);
    line[tot - 1] = line[tot - 2] = i;
  }
  for (int i = 0; i < tot; i++) loc[i] = i;
  sort(loc, loc + tot, cmp1);
  for (int i = 0; i < tot; i++) pos[loc[i]] = i + 1;
  for (int i = 0; i < tot; i++)
    if (i % 2 && pos[i] < pos[i ^ 1]) swap(pos[i], pos[i ^ 1]);
  for (int i = 0; i < tot / 2; i++) seq[i] = i << 1;
  sort(seq, seq + tot / 2, cmp2);
}
void add(int x) {
  for (; x > 0 && x <= tot; x += x & -x) tr[x]++;
}
int sum(int x) {
  int ret = 0;
  for (; x > 0 && x <= tot; x -= x & -x) ret += tr[x];
  return ret;
}
long long check(long double D) {
  prep(D);
  long long ret = 0;
  memset(tr, 0, sizeof tr);
  for (int i = 0; i < tot / 2; i++) {
    int j = seq[i];
    ret += sum(pos[j ^ 1]) - sum(pos[j]);
    add(pos[j ^ 1]);
  }
  return ret;
}
long double cross(point o, point a, point b) {
  return (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
}
point intersect(point p1, point p2, point p3, point p4) {
  long double k = fabs(cross(p1, p2, p3) / cross(p1, p2, p4));
  return (point){(p3.x + k * p4.x) / (1 + k), (p3.y + k * p4.y) / (1 + k)};
}
long double intersection(int i, int j) {
  i = line[i], j = line[j];
  long double x = (b[j] - b[i]) / (a[i] - a[j]);
  long double y = a[j] * x + b[j];
  x -= o.x;
  y -= o.y;
  return sqrtl(x * x + y * y);
}
void prt(long double D) {
  long double ans = 0;
  prep(D);
  set<pair<int, int> > seg;
  seg.clear();
  long double maxd = 0;
  int cnt = 0;
  for (int i = 0; i < tot / 2; i++) {
    int j = seq[i];
    set<pair<int, int> >::iterator it1, it2;
    it1 = seg.lower_bound(make_pair(pos[j], 0));
    it2 = seg.upper_bound(make_pair(pos[j ^ 1], 0));
    if (!seg.empty() && it1 != it2) {
      for (; it1 != it2; it1++) {
        long double d = intersection(j, (it1->second));
        if (d > maxd + eps)
          ans += cnt * maxd, m -= cnt, cnt = 1, maxd = d;
        else if (fabs(d - maxd) < eps)
          cnt++;
        else
          ans += d, m--;
      }
    }
    seg.insert(make_pair(pos[j ^ 1], j));
  }
  printf("%.12lf\n", (double)(ans + m * maxd));
}
int main() {
  scanf("%d", &n);
  read(o.x), read(o.y);
  scanf("%d", &m);
  for (int i = 1; i <= n; i++) read(a[i]), read(b[i]);
  long double l = 0., r = 1e10;
  for (int t = 0; t < 100; t++) {
    if (check(((l + r) / (long double)2.0)) >= m)
      r = ((l + r) / (long double)2.0);
    else
      l = ((l + r) / (long double)2.0);
  }
  prt(r);
  return 0;
}
