#include <bits/stdc++.h>
using namespace std;
const long long infl = ~0LLU >> 2;
template <class T>
inline void Min(T &x, T y) {
  if (y < x) x = y;
}
template <class T>
inline void Max(T &x, T y) {
  if (y > x) x = y;
}
const int maxn = 50000;
const double scale = 1e3, pi = acos(-1.0L), eps = 1e-12L;
int n, m, ns;
double cx, cy;
double la[maxn], lb[maxn];
pair<double, double> seg[maxn];
double arcs[maxn * 2];
struct Seg {
  int l, r, id;
  bool operator<(const Seg &b) const {
    return l < b.l || (l == b.l && r < b.r);
  }
} segi[maxn];
int ord[maxn];
double Fix(double x) {
  while (x >= pi) x -= 2 * pi;
  while (x < -pi) x += 2 * pi;
  return x;
}
void MakeSegments(double radius) {
  ns = 0;
  for (int i = 0; i < n; ++i) {
    double down = sqrt(la[i] * la[i] + 1);
    double up = cy - la[i] * cx - lb[i];
    double dist = up / down;
    if (abs(dist) > radius) continue;
    double alpha = atan2(la[i], 1) - pi / 2;
    if (dist < 0) {
      dist *= -1;
      alpha += pi;
    }
    double len_sqr = radius * radius - dist * dist;
    double delta =
        acos((radius * radius + dist * dist - len_sqr) / (2 * radius * dist));
    if (dist < eps) delta = pi / 2;
    double beta1 = Fix(alpha + delta), beta2 = Fix(alpha - delta);
    if (beta1 > beta2) swap(beta1, beta2);
    seg[ns] = {beta1, beta2};
    arcs[2 * ns] = beta1;
    arcs[2 * ns + 1] = beta2;
    segi[ns].id = i;
    ++ns;
  }
  sort(arcs, arcs + 2 * ns);
  for (int i = 0; i < ns; ++i) {
    segi[i].l = (int)(lower_bound(arcs, arcs + 2 * ns, seg[i].first) - arcs);
    segi[i].r = (int)(lower_bound(arcs, arcs + 2 * ns, seg[i].second) - arcs);
  }
  sort(segi, segi + ns);
  for (int i = 0; i < ns; ++i) {
    ord[i] = i;
  }
  sort(ord, ord + ns, [](int i, int j) { return segi[i].r < segi[j].r; });
}
namespace bit {
int N;
int bit[2 * maxn];
void Init(void) {
  N = 2 * ns;
  memset((bit), (0), sizeof(bit));
}
int Low(int i) { return i & -i; }
void Add(int i, int x) {
  for (; i < N; i += Low(i + 1)) {
    bit[i] += x;
  }
}
int Sum(int i) {
  int sum = 0;
  for (; i >= 0; i -= Low(i + 1)) {
    sum += bit[i];
  }
  return sum;
}
}  // namespace bit
long long Count(double radius) {
  MakeSegments(radius);
  bit::Init();
  using bit::Add;
  using bit::Sum;
  long long ans = 0;
  int next = 0;
  for (int i = 0; i < ns; ++i) {
    int l = segi[i].l, r = segi[i].r;
    while (next < ns && segi[ord[next]].r < l) {
      Add(segi[ord[next]].r, -1);
      ++next;
    }
    ans += Sum(r);
    Add(r, 1);
  }
  return ans;
}
struct Cmp {
  bool operator()(const Seg &a, const Seg &b) const {
    if (a.r != b.r) return a.r < b.r;
    return a.id < b.id;
  }
};
void Get(int id, double &k, double &b) {
  k = la[id];
  b = lb[id];
}
double Cost(int id1, int id2) {
  double k1, b1, k2, b2;
  Get(id1, k1, b1);
  Get(id2, k2, b2);
  double x = (b2 - b1) / (k1 - k2);
  double y = k1 * x + b1;
  x -= cx;
  y -= cy;
  return sqrt(x * x + y * y);
}
pair<long long, double> Output(double radius) {
  MakeSegments(radius);
  set<Seg, Cmp> s;
  long long cnt = 0;
  int next = 0;
  double sum = 0;
  for (int i = 0; i < ns; ++i) {
    int l = segi[i].l, r = segi[i].r;
    while (next < ns && segi[ord[next]].r < l) {
      s.erase(segi[ord[next]]);
      ++next;
    }
    for (set<Seg, Cmp>::iterator x = s.begin(); x != s.end(); ++x) {
      if (x->r > r) break;
      ++cnt;
      sum += Cost(x->id, segi[i].id);
    }
    s.insert(segi[i]);
  }
  return {cnt, sum};
}
double Solve(void) {
  double low = 0, high = 1e12;
  for (int i = 0; i < 80; ++i) {
    double mid = (low + high) * 0.5;
    if (Count(mid) > m) {
      high = mid;
    } else {
      low = mid;
    }
  }
  double radius = low;
  pair<long long, double> res = Output(radius - eps);
  return res.second + (double)(m - res.first) * radius;
}
int main(void) {
  scanf("%d", &n);
  int x, y;
  scanf("%d%d%d", &x, &y, &m);
  cx = x / scale;
  cy = y / scale;
  for (int i = 0; i < n; ++i) {
    scanf("%d%d", &x, &y);
    la[i] = x / scale;
    lb[i] = y / scale;
  }
  double ans = Solve();
  printf("%.20lf\n", ans);
  return 0;
}
