#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  char c = getchar();
  int x = 0, f = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') f = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + c - '0';
  return x * f;
}
inline long double ggi() { return (long double)gi() / 1000.0; }
const int N = 1e5 + 5;
const long double eps = 1e-11;
int n, m, xl[N], xr[N], qed;
long double p, q, a[N], b[N], t[N];
struct seg {
  long double x1, y1, x2, y2, t1, t2;
  int id;
};
vector<seg> v;
vector<long double> c;
vector<int> vl[N], vr[N];
bool sol;
void upd(int i, int w) {
  for (; i < N; i += (i & -i)) t[i] += w;
}
int qry(int i) {
  int r = 0;
  for (; i; i -= (i & -i)) r += t[i];
  return r;
}
pair<long double, long double> solveq(long double a, long double b,
                                      long double c) {
  sol = true;
  long double del = b * b - a * c * 4;
  if (del < eps) {
    sol = false;
    return make_pair(0.0, 0.0);
  }
  return make_pair((-b + sqrt(del)) / a / 2, (-b - sqrt(del)) / a / 2);
}
void prepare(long double r) {
  v.clear(), c.clear();
  for (int i = 0; i < N; ++i) vl[i].clear(), vr[i].clear();
  for (int i = 1; i <= n; ++i) {
    pair<long double, long double> tx =
        solveq(a[i] * a[i] + 1, a[i] * b[i] * 2, b[i] * b[i] - r * r);
    if (!sol) continue;
    pair<long double, long double> ty =
        make_pair(tx.first * a[i] + b[i], tx.second * a[i] + b[i]);
    long double t1 = atan2(ty.first, tx.first),
                t2 = atan2(ty.second, tx.second);
    if (t1 > t2)
      swap(t1, t2), swap(tx.first, tx.second), swap(ty.first, ty.second);
    v.push_back((seg){tx.first, ty.first, tx.second, ty.second, t1, t2, i});
    c.push_back(t1), c.push_back(t2);
  }
  sort(c.begin(), c.end()), c.erase(unique(c.begin(), c.end()), c.end());
  for (int i = 0; i < v.size(); ++i) {
    xl[i] = lower_bound(c.begin(), c.end(), v[i].t1) - c.begin() + 1,
    xr[i] = lower_bound(c.begin(), c.end(), v[i].t2) - c.begin() + 1;
    vl[xl[i]].push_back(i), vr[xr[i]].push_back(i);
  }
}
bool check(long double r) {
  prepare(r);
  long long res = 0;
  memset(t, 0, sizeof(t));
  for (int i = 1; i <= c.size(); ++i) {
    for (auto x : vl[i]) upd(i, 1);
    for (auto x : vr[i]) res += qry(i) - qry(xl[x]), upd(xl[x], -1);
  }
  return res >= m;
}
long double solveq1(int i, int j) {
  if (fabs(a[i] - a[j]) < eps) return 0;
  long double x = (b[j] - b[i]) / (a[i] - a[j]), y = x * a[i] + b[i];
  ++qed;
  return sqrt(x * x + y * y);
}
long double solve(long double r) {
  prepare(r);
  set<pair<int, int>> s;
  long double ans = 0;
  qed = 0;
  for (int i = 1; i <= c.size(); ++i) {
    for (auto x : vl[i]) s.insert(make_pair(i, x));
    for (auto x : vr[i]) {
      auto it = s.upper_bound(make_pair(xl[x], 1 << 30));
      for (; it != s.end() && it->first < xr[x]; ++it)
        ans += solveq1(v[x].id, v[it->second].id);
      s.erase(make_pair(xl[x], x));
    }
  }
  return ans + r * (m - qed);
}
int main() {
  n = gi(), p = ggi(), q = ggi(), m = gi();
  for (int i = 1; i <= n; ++i) a[i] = ggi(), b[i] = ggi() + a[i] * p - q;
  long double l = 0.0, r = 1e10;
  for (int i = 1; i <= 100; ++i) {
    long double mid = (l + r) / 2.0;
    check(mid) ? r = mid : l = mid;
  }
  cout << fixed << setprecision(9) << max((long double)0.0, solve(r)) << endl;
}
