#include <bits/stdc++.h>
using namespace std;
long long max(long long a, long long b) {
  if (a > b) {
    return a;
  } else {
    return b;
  }
}
long long min(long long a, long long b) {
  if (a < b) {
    return a;
  } else {
    return b;
  }
}
inline bool eq(double x, double y) { return (abs(x - y) < 1e-23); }
inline bool leq(double x, double y) { return y + 1e-23 > x; }
inline bool lq(double x, double y) { return y > x + 1e-23; }
struct P {
  double x, y;
  P() {}
  P(int x, int y) : x(double(x)), y(double(y)) {}
  P(double x, double y) : x(x), y(y) {}
  P operator+(const P &a) const { return P(x + a.x, y + a.y); }
  P operator-(const P &a) const { return P(x - a.x, y - a.y); }
  P operator*(const double &a) const { return P(x * a, y * a); }
  P operator/(const double &a) const { return P(x / a, y / a); }
  bool operator==(const P &a) const {
    return (abs(a.x - x) < 1e-23 && abs(a.y - y) < 1e-23);
  }
  double operator*(const P &a) const { return x * a.x + y * a.y; }
  double operator^(const P &a) const { return x * a.y - y * a.x; }
  void in() { scanf("%lf%lf", &x, &y); }
  double dist(P a) {
    return sqrt((a.x - x) * (a.x - x) + (a.y - y) * (a.y - y));
  }
  double ang(P a) {
    double ab = atan2(a.x - x, a.y - y);
    if (ab < -1 * 1e-23) ab += 2 * acos(-1.0);
    return ab;
  }
};
struct seg {
  P s, e;
  bool is_seg;
  seg() {}
  seg(P s, P e, bool seg) : s(s), e(e), is_seg(seg) {}
};
inline P intersect3(const seg A, const seg B) {
  double u = ((B.s - A.s) ^ (B.e - B.s)) / ((A.e - A.s) ^ (B.e - B.s));
  return A.s + (A.e - A.s) * u;
}
bool operator<(P u, P v) {
  if (u.x < v.x) return true;
  if (u.x > v.x) return false;
  return u.y < v.y;
}
inline double sign(double u) {
  if (lq(u, 0.00)) return -1.00;
  return 1.00;
}
int Circle_Line_Intersection(seg A, const double R, const P C, P res[]) {
  A.s = A.s - C;
  A.e = A.e - C;
  double dist = A.e.dist(A.s);
  dist = dist * dist;
  double D = A.s ^ A.e;
  double dx = A.e.x - A.s.x;
  double dy = A.e.y - A.s.y;
  double deter = R * R * dist - D * D;
  if (lq(deter, 0)) return 0;
  if (eq(deter, 0)) {
    res[0] = P(D * dy / (dist), -D * dx / (dist));
    res[1] = res[0];
    return 1;
  }
  double d1 = sign(dy) * dx * sqrt(deter);
  double d2 = abs(dy) * sqrt(deter);
  res[0] = P((D * dy + d1) / (dist), (-D * dx + d2) / dist);
  res[1] = P((D * dy - d1) / (dist), (-D * dx - d2) / dist);
  res[0] = res[0] + C;
  res[1] = res[1] + C;
  return 2;
}
struct E {
  int id, ty;
  double val;
  E() {}
  E(int id, int ty, double val) : id(id), ty(ty), val(val) {}
} Z[200001];
bool operator<(E u, E v) {
  if (eq(u.val, v.val)) {
    return u.ty < v.ty;
  }
  return lq(u.val, v.val);
}
int h, sum[200001], cc;
void update(int index) {
  for (int i = index; i <= cc; i += i & (-i)) sum[i]++;
}
int getSum(int index) {
  int ans = 0;
  for (int i = index; i; i -= i & (-i)) ans += sum[i];
  return ans;
}
void init(int u) {
  for (int i = (1); i <= (2 * u); i++) sum[i] = 0;
  cc = 2 * u;
}
int n, k, ff[200001];
P X, y[3];
seg T[200001];
double d, low, high;
bool ok(double q) {
  init(n);
  int cnt = 0;
  for (int i = (1); i <= (n); i++) {
    if (Circle_Line_Intersection(T[i], q, X, y) > 0) {
      Z[++cnt] = E(i, 0, X.ang(y[0]));
      Z[++cnt] = E(i, 1, X.ang(y[1]));
      if (lq(Z[cnt].val, Z[cnt - 1].val)) {
        Z[cnt].ty = 0;
        Z[cnt - 1].ty = 1;
      }
    }
  }
  if (cnt == 0) return true;
  sort(Z + 1, Z + cnt + 1);
  long long pp = 0;
  for (int i = (1); i <= (cnt); i++)
    if (Z[i].ty == 1) {
      ff[Z[i].id] = i;
    }
  for (int i = (1); i <= (cnt); i++)
    if (Z[i].ty == 0) {
      pp += getSum(ff[Z[i].id]) - getSum(i - 1);
      update(ff[Z[i].id]);
    }
  return pp < (long long)k;
}
set<pair<int, int> > QQ;
double ff2[200001];
int main() {
  scanf("%d", &n);
  X.in();
  X = X / 1000.00;
  scanf("%d", &k);
  for (int i = (1); i <= (n); i++) {
    double a1, b1;
    scanf("%lf%lf", &a1, &b1);
    a1 /= 1000.00;
    b1 /= 1000.00;
    T[i] = seg(P(0.00, b1), P(1.00, a1 + b1), 1);
  }
  low = 0.00;
  high = 2000001000.00;
  for (int u = (1); u <= (50); u++) {
    double mid = (low + high) / 2.00;
    if (ok(mid)) {
      low = mid;
    } else {
      high = mid;
    }
  }
  d = low - 1e-23;
  if (leq(d, 0.00)) {
    puts("0.000\n");
    return 0;
  }
  double res = 0.00;
  int cur = 0;
  int cnt = 0;
  for (int i = (1); i <= (n); i++) {
    if (Circle_Line_Intersection(T[i], d, X, y) > 0) {
      Z[++cnt] = E(i, 0, X.ang(y[0]));
      Z[++cnt] = E(i, 1, X.ang(y[1]));
      if (lq(Z[cnt].val, Z[cnt - 1].val)) {
        Z[cnt].ty = 0;
        Z[cnt - 1].ty = 1;
      }
    }
  }
  sort(Z + 1, Z + cnt + 1);
  for (int i = (1); i <= (cnt); i++)
    if (Z[i].ty == 1) {
      ff2[Z[i].id] = i;
    }
  for (int i = (1); i <= (cnt); i++)
    if (Z[i].ty == 0) {
      if (QQ.size()) {
        auto it = QQ.lower_bound(make_pair(i, 0));
        while (it != QQ.end() && (*it).first < ff2[Z[i].id]) {
          cur++;
          P A = intersect3(T[Z[i].id], T[(*it).second]);
          res += X.dist(A);
          ++it;
        }
      }
      QQ.insert(make_pair(ff2[Z[i].id], Z[i].id));
    }
  res += (double)(k - cur) * (d);
  printf("%.12lf\n", res);
  return 0;
}
