#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 29, N = 5e5 + 50, M = 1e6 + 5;
inline int read() {
  int f = 1, x = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
void judge() {
  freopen("data.in", "r", stdin);
  freopen("data.out", "w", stdout);
}
const double pi = acos(-1);
int n, sp[N], bit[N];
double ax, ay, m;
struct lin {
  double a, b, c, l, th;
  lin(double a = 0, double b = 0, double c = 0) : a(a), b(b), c(c) {
    if (b != 0) {
      l = abs(c) / sqrt(a * a + b * b);
      th = atan(-1 * a / b);
      if (b * c > 0) th += pi;
      th += pi / 2;
    }
  }
} line[N];
struct point {
  double x, y;
  point(double x = 0, double y = 0) : x(x), y(y) {}
  double operator&(const point &b) { return x * b.y - y * b.x; }
};
pair<double, int> ia[N * 2];
double opt(double x) {
  while (x < 0) x += pi * 2;
  while (x > pi * 2) x -= pi * 2;
  return x;
}
void add(int x, int k, int n) {
  for (; x <= n; x += x & (-x)) bit[x] += k;
}
int sum(int x) {
  int res = 0;
  for (; x; x -= x & (-x)) res += bit[x];
  return res;
}
long long cnt(double r) {
  int k = 0;
  for (int(i) = (0); (i) < (n); i++)
    if (line[i].l <= r) {
      double theta = acos(line[i].l / r);
      double t1 = opt(line[i].th + theta), t2 = opt(line[i].th - theta);
      ia[k++] = pair<double, int>(min(t1, t2), i * 2);
      ia[k++] = pair<double, int>(max(t1, t2), i * 2 + 1);
    }
  sort(ia, ia + k);
  long long res = 0;
  memset(bit, 0, sizeof(bit));
  for (int(i) = (0); (i) < (k); i++) {
    if (ia[i].second & 1) {
      res += sum(i + 1) - sum(sp[ia[i].second / 2] + 1);
      add(sp[ia[i].second / 2] + 1, -1, k);
    } else {
      sp[ia[i].second / 2] = i;
      add(i + 1, 1, k);
    }
  }
  return res;
}
double iadis(int i, int j) {
  lin &A = line[i], &B = line[j];
  double tmp = point(A.a, A.b) & point(B.a, B.b);
  double x = (point(A.b, A.c) & point(B.b, B.c)) / tmp;
  double y = -(point(A.a, A.c) & point(B.a, B.c)) / tmp;
  return sqrt(x * x + y * y);
}
int q1[N], q2[N];
double cal(double r) {
  int num = 0, n1 = 0, n2 = 0, k = 0;
  for (int(i) = (0); (i) < (n); i++)
    if (line[i].l <= r) {
      double theta = acos(line[i].l / r);
      double t1 = opt(line[i].th + theta), t2 = opt(line[i].th - theta);
      ia[k++] = pair<double, int>(min(t1, t2), i * 2);
      ia[k++] = pair<double, int>(max(t1, t2), i * 2 + 1);
    }
  sort(ia, ia + k);
  double res = 0;
  for (int(i) = (0); (i) < (k); i++)
    if (ia[i].second & 1) {
      int tmp = ia[i].second >> 1;
      while (q1[--n1] != tmp) {
        q2[n2++] = q1[n1];
        res += iadis(tmp, q1[n1]);
        num++;
      }
      while (n2) {
        q1[n1++] = q2[--n2];
      }
    } else
      q1[n1++] = ia[i].second >> 1;
  return res + (m - num) * r;
}
int main() {
  n = read();
  ax = read() * 1.0;
  ay = read(), m = read();
  for (int(i) = (0); (i) < (n); i++) {
    int a = read(), b = read();
    line[i] = lin(a * 1.0, -1000, a / 1000.0 * ax - ay + b);
  }
  double l = 0, r = 2.1e9;
  for (int(i) = (0); (i) < (100); i++) {
    double mid = (l + r) / 2;
    if (cnt(mid) < m)
      l = mid;
    else
      r = mid;
  }
  printf("%.9lf\n", cal(l));
}
