func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 5e4 + 5;   const double eps = 1e-10;   int n, m, cnt, v[N], tr[N << 1];   double a[N], b[N];   pair<double, int> e[N << 1];   inline int read() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = (x << 3) + (x << 1) + (ch ^ 48);       ch = getchar();     }     return x * f;   }   int lowbit(int x) { return x & (-x); }   void add(int x, int y) {     while (x <= cnt) tr[x] += y, x += lowbit(x);   }   int query(int x) {     int res = 0;     while (x) res += tr[x], x -= lowbit(x);     return res;   }   void work(double r) {     cnt = 0;     for (int i = 1; i <= n; i++) {       double a = ::a[i], b = ::b[i],              d = 4.0 * (a * a * b * b - (a * a + 1.0) * (b * b - r * r));       if (d < eps) continue;       d = sqrt(d);       double x = (-2.0 * a * b - d) / ((a * a + 1.0) * 2.0),              xx = (-2.0 * a * b + d) / ((a * a + 1.0) * 2.0);       double y = a * x + b, yy = a * xx + b;       e[++cnt] = make_pair(atan2(y, x), i);       e[++cnt] = make_pair(atan2(yy, xx), i);     }     sort(e + 1, e + cnt + 1);     for (int i = 1; i <= cnt; i++) v[e[i].second] = i;   }   int check(double r) {     work(r);     for (int i = 1; i <= cnt; i++) tr[i] = 0;     long long ans = 0;     for (int i = 1; i <= cnt; i++)       if (v[e[i].second] != i) {         ans += query(v[e[i].second]) - query(i - 1);         add(v[e[i].second], 1);       }     return ans >= m;   }   double calc(int i, int j) {     double x = (b[j] - b[i]) / (a[i] - a[j]), y = a[i] * x + b[i];     return sqrt(x * x + y * y);   }   double calc(double r) {     work(r);     set<pair<double, int> > s;     double ans = 0;     int tot = 0;     for (int i = 1; i <= cnt; i++)       if (v[e[i].second] != i) {         auto it = s.upper_bound(make_pair(i + 1, 0));         while (it != s.end() && it->first < v[e[i].second])           ans += calc(e[i].second, it->second), it++, tot++;         s.insert(make_pair(v[e[i].second], e[i].second));       }     return ans + (m - tot) * r;   }   int main() {     n = read();     double p = (double)read() / 1000.0, q = (double)read() / 1000.0;     m = read();     for (int i = 1; i <= n; i++) {       a[i] = (double)read() / 1000.0;       b[i] = (double)read() / 1000.0;       b[i] += a[i] * p - q;     }     double l = 0, r = 1e10;     for (int i = 1; i <= 100; i++) {       double mid = (l + r) / 2.0;       if (check(mid))         r = mid;       else         l = mid;     }     printf( %.10f n , max((double)0, calc(r)));     fclose(stdin);     fclose(stdout);     return 0;   }   