#include <bits/stdc++.h>
using namespace std;
struct point {
  double first, second;
  inline point(double first = 0, double second = 0)
      : first(first), second(second) {}
  inline double operator*(point a) {
    return first * a.first + second * a.second;
  }
  inline double operator^(point a) {
    return first * a.second - second * a.first;
  }
  inline point operator*(double a) { return point(first * a, second * a); }
  inline point operator-(point a) {
    return point(first - a.first, second - a.second);
  }
  inline point operator+(point a) {
    return point(first + a.first, second + a.second);
  }
  inline point norm() {
    double s = nor();
    return point(first / s, second / s);
  }
  inline point conj() { return point(-second, first); }
  inline double nor() { return sqrt(first * first + second * second); }
  inline void input() {
    scanf("%lf %lf", &first, &second);
    first /= 1000, second /= 1000;
  }
} F;
int aa, bb, n, m;
struct line {
  point a, b, dir;
  double dst;
  inline line(point a = point(), point b = point()) : a(a), b(b) {}
  inline void input() {
    scanf("%d %d", &aa, &bb);
    a = point(0, bb / 1000.) - F;
    b = point(1, (aa + bb) / 1000.) - F;
    dir = (b - a).conj().norm(), dst = fabs(a * dir);
  }
} L[101010];
int pos[101010], B[101010], mx;
inline void update(int u, int first) {
  for (; u <= mx; u += u & -u) B[u] += first;
}
inline int calc(int u) {
  int ans = 0;
  for (; u; u ^= u & -u) ans += B[u];
  return ans;
}
vector<pair<double, pair<int, int> > > vec;
inline bool can(double R) {
  int N = 0;
  vec.clear();
  for (int i = 1; i <= n; i++)
    if (L[i].dst < R) {
      F = L[i].dir * (L[i].a * L[i].dir);
      point dir = L[i].dir.conj();
      double r = sqrt(R * R - L[i].dst * L[i].dst);
      point A = F + dir * r, B = F - dir * r;
      double al = atan2(A.second, A.first), bl = atan2(B.second, B.first);
      if (al > bl) swap(al, bl);
      vec.push_back(pair<double, pair<int, int> >(al, pair<int, int>(1, ++N)));
      vec.push_back(pair<double, pair<int, int> >(bl, pair<int, int>(0, N)));
    }
  sort(vec.begin(), vec.end());
  long long ans = 0;
  mx = vec.size();
  for (int i = 1; i <= mx; i++) B[i] = 0;
  for (int i = 0; i < vec.size(); i++) {
    pair<double, pair<int, int> > p = vec[i];
    if (p.second.first)
      update(i + 1, 1), pos[p.second.second] = i + 1;
    else {
      ans += calc(i + 1) - calc(pos[p.second.second]);
      if (ans > m) return true;
      update(pos[p.second.second], -1);
    }
  }
  return false;
}
int q[101010];
vector<int> tmp;
inline double solve(double R) {
  int N = 0;
  vec.clear();
  for (int i = 1; i <= n; i++)
    if (L[i].dst < R) {
      F = L[i].dir * (L[i].a * L[i].dir);
      point dir = L[i].dir.conj();
      double r = sqrt(R * R - L[i].dst * L[i].dst);
      point A = F + dir * r, B = F - dir * r;
      double al = atan2(A.second, A.first), bl = atan2(B.second, B.first);
      if (al > bl) swap(al, bl);
      vec.push_back(pair<double, pair<int, int> >(al, pair<int, int>(1, ++N)));
      vec.push_back(pair<double, pair<int, int> >(bl, pair<int, int>(0, N)));
      pos[N] = i;
    }
  sort(vec.begin(), vec.end());
  double ans = 0;
  int num = 0, qb = 0;
  for (int i = 0; i < vec.size(); i++) {
    pair<double, pair<int, int> > p = vec[i];
    if (p.second.first)
      q[qb++] = p.second.second;
    else {
      tmp.clear();
      point a = L[pos[p.second.second]].a, b = L[pos[p.second.second]].b;
      while (qb && q[--qb] != p.second.second) {
        point c = L[pos[q[qb]]].a, d = L[pos[q[qb]]].b;
        tmp.push_back(q[qb]);
        double s1 = a - c ^ d - c, s2 = d - c ^ b - c;
        F = a + (b - a) * (s1 / (s1 + s2));
        ans += F.nor(), num++;
      }
      while (!tmp.empty()) q[qb++] = tmp.back(), tmp.pop_back();
    }
  }
  return ans + (m - num) * R;
}
int main() {
  scanf("%d", &n), F.input();
  scanf("%d", &m);
  for (int i = 1; i <= n; i++) L[i].input();
  double st = 0, ed = 1e10, md;
  for (int i = 100; i--;) {
    double md = (st + ed) / 2;
    if (can(md))
      ed = md;
    else
      st = md;
  }
  printf("%.10lf\n", solve(st));
}
