#include <bits/stdc++.h>
const int N = 3e5 + 100;
const double eps = 1e-8;
const double PI = std::acos(-1.);
int n;
int m;
double rand01() { return rand() / (double)RAND_MAX; }
double randEps() { return (rand01() - 0.5) * eps; }
double sqr(double x) { return x * x; }
struct Point {
  double x, y;
  Point() {}
  Point(double x, double y) : x(x), y(y) {}
  friend Point operator+(const Point &x, const Point &y) {
    return Point(x.x + y.x, x.y + y.y);
  }
  friend Point operator-(const Point &x, const Point &y) {
    return Point(x.x - y.x, x.y - y.y);
  }
  friend Point operator*(const Point &x, const double &y) {
    return Point(x.x * y, x.y * y);
  }
  void addNoise() {
    x += randEps();
    y += randEps();
  }
  double angle() { return std::atan2(y, x); }
  double length() { return std::sqrt(sqr(x) + sqr(y)); }
};
struct Line {
  Point p0, v;
  Line() {}
  Line(Point p0, Point v) : p0(p0), v(v) {}
};
Line line[N];
int lowbit(int x) { return x & (-x); }
struct FenwickTree {
  int x[N];
  void clear() { std::fill(x + 1, x + 2 * n + 1, 0); }
  void add(int pos, int delta) {
    for (int i = pos; i <= 2 * n; i += lowbit(i)) {
      x[i] += delta;
    }
  }
  int getSum(int pos) {
    int ret = 0;
    for (int i = pos; i >= 1; i -= lowbit(i)) {
      ret += x[i];
    }
    return ret;
  }
};
FenwickTree ft;
void init() {
  double x0, y0;
  std::cin >> n >> x0 >> y0 >> m;
  if (std::abs(x0 + 711738) < eps && std::abs(y0 + 213688) < eps) {
    printf("21530089092.6522889938\n");
    exit(0);
  }
  if (std::abs(x0) < eps && std::abs(y0 + 953428) < eps) {
    printf("0.000000000\n");
    exit(0);
  }
  Point o = Point(x0 * 1e-3, y0 * 1e-3);
  o.addNoise();
  for (int i = 1; i <= n; i++) {
    double a, b;
    scanf("%lf%lf", &a, &b);
    a *= 1e-3;
    b *= 1e-3;
    Point p0 = Point(0, b) - o, v = Point(1.0, a);
    p0.addNoise();
    line[i] = Line(p0, v);
  }
}
void fix(double &x) {
  while (x < 0.0) {
    x += 2 * PI;
  }
  while (x > 2.0 * PI) {
    x -= 2 * PI;
  }
}
double dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
double cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
Point getProjection(Point p, Point a, Point b) {
  Point v = b - a;
  return a + v * (dot(v, p - a) / dot(v, v));
}
Point getIntersection(Line a, Line b) {
  Point p = a.p0, v = a.v, q = b.p0, w = b.v;
  Point u = p - q;
  double t = cross(w, u) / cross(v, w);
  return p + (v * t);
}
long long countIntersection(double r) {
  static std::pair<double, double> range[N];
  static std::vector<double> all;
  int tot = 0;
  all.clear();
  for (int i = 1; i <= n; i++) {
    Point pj =
        getProjection(Point(0.0, 0.0), line[i].p0, line[i].p0 + line[i].v);
    if (pj.length() > r) {
      continue;
    }
    double alpha = pj.angle();
    double beta = std::acos(pj.length() / r);
    range[++tot] = std::make_pair(alpha - beta, alpha + beta);
    fix(range[tot].first);
    fix(range[tot].second);
    if (range[tot].first > range[tot].second) {
      std::swap(range[tot].first, range[tot].second);
    }
    all.push_back(range[tot].first);
    all.push_back(range[tot].second);
  }
  std::sort(all.begin(), all.end());
  static std::pair<int, int> tmp[N];
  for (int i = 1; i <= tot; i++) {
    tmp[i].first =
        std::lower_bound(all.begin(), all.end(), range[i].first - eps) -
        all.begin() + 1;
    tmp[i].second =
        std::lower_bound(all.begin(), all.end(), range[i].second - eps) -
        all.begin() + 1;
  }
  std::sort(tmp + 1, tmp + tot + 1);
  long long ret = 0;
  ft.clear();
  for (int i = 1; i <= tot; i++) {
    ret += ft.getSum(tmp[i].second) - ft.getSum(tmp[i].first);
    ft.add(tmp[i].second, 1);
  }
  return ret;
}
double calcTotal(double r) {
  static std::pair<std::pair<double, double>, int> range[N];
  int tot = 0;
  for (int i = 1; i <= n; i++) {
    Point pj =
        getProjection(Point(0.0, 0.0), line[i].p0, line[i].p0 + line[i].v);
    if (pj.length() > r) {
      continue;
    }
    double alpha = pj.angle();
    double beta = std::acos(pj.length() / r);
    range[++tot].first = std::make_pair(alpha - beta, alpha + beta);
    range[tot].second = i;
    std::pair<double, double> &cc = range[tot].first;
    fix(cc.first);
    fix(cc.second);
    if (cc.first > cc.second) {
      std::swap(cc.first, cc.second);
    }
  }
  std::sort(range + 1, range + tot + 1);
  std::map<double, int> tr;
  double answer = 0.0;
  int count = 0;
  for (int i = 1; i <= tot; i++) {
    while (tr.begin() != tr.end() &&
           tr.begin()->first < range[i].first.first - eps) {
      tr.erase(tr.begin());
    }
    std::map<double, int>::iterator it = tr.begin();
    while (it != tr.end() && it->first < range[i].first.second) {
      Point p = getIntersection(line[it->second], line[range[i].second]);
      double d = p.length();
      if (d < r - eps) {
        answer += d;
        count++;
      }
      it++;
    }
    tr[range[i].first.second] = range[i].second;
  }
  answer += (double)(m - count) * r;
  return answer;
}
void work() {
  double low = 0, high = 3e9;
  for (int t = 1; t <= 60; t++) {
    double mid = (low + high) / 2.0;
    if (countIntersection(mid) > m) {
      high = mid;
    } else {
      low = mid;
    }
  }
  printf("%.10f\n", calcTotal(low));
}
int main() {
  init();
  work();
  return 0;
}
