#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:1000000000 )   #pragma GCC optimize( Ofast,no-stack-protector,unroll-loops )   using namespace std;   const int maxn = (int)1e5 + 10;   struct vt {     long double x, y;   };   vt operator-(vt a, vt b) {     a.x -= b.x;     a.y -= b.y;     return a;   }   vt operator+(vt a, vt b) {     a.x += b.x;     a.y += b.y;     return a;   }   vt operator*(vt a, long double x) {     a.x *= x;     a.y *= x;     return a;   }   long double dst(vt a) { return hypotl(a.x, a.y); }   vt operator/(vt a, long double x) {     a.x /= x;     a.y /= x;     return a;   }   const long double eps = 1e-18;   vector<vt> inter(vt a, long double r) {     long double d = dst(a);     if (d * d <= r * r) {       return {};     }     long double x = r * r / d;     long double y = r * sqrt(1. - (r / d) * (r / d));     vt b = a * (x / dst(a));     vt n = {-a.y, a.x};     n = n / dst(n);     return {b - n * y, b + n * y};   }   long double operator*(vt a, vt b) { return a.x * b.y - a.y * b.x; }   int tp(vt a) { return a.y > eps || (abs(a.y) < eps && a.x > eps); }   vt v[maxn];   bool operator<(vt a, vt b) {     int tpa = tp(a);     int tpb = tp(b);     if (tpa != tpb) {       return tpa < tpb;     }     return a * b > eps;   }   int tr[4 * maxn];   void change(int pos) {     for (; pos < 4 * maxn; pos |= pos + 1) {       tr[pos]++;     }   }   int go(int pos) {     int ans = 0;     for (; pos >= 0; pos = (pos & (pos + 1)) - 1) {       ans += tr[pos];     }     return ans;   }   int go(int l, int r) { return go(r) - go(l - 1); }   ostream& operator<<(ostream& out, vt a) { return out << a.x <<     << a.y; }   mt19937 rr;   int main() {     int n;     long long k;     cin >> n >> k;     for (int i = 0; i < n; i++) {       cin >> v[i].x >> v[i].y;     }     k = (long long)n * (n - 1) / 2 - k;     long double l = 0;     long double r = sqrt(2.) * 1e4;     for (int itr = 0; itr < 36; itr++) {       long double m = (l + r) / 2;       vector<vt> g;       vector<pair<vt, vt> > f;       for (int i = 0; i < n; i++) {         auto a = inter(v[i], m);         if (a.empty()) {           continue;         }         f.push_back(make_pair(a[0], a[1]));         g.push_back(a[0]);         g.push_back(a[1]);       }       sort((g).begin(), (g).end());       vector<pair<int, int> > a;       memset(tr, 0, sizeof tr);       for (int i = 0; i < (int)f.size(); i++) {         a.push_back(make_pair(             lower_bound((g).begin(), (g).end(), f[i].first) - g.begin(),             lower_bound((g).begin(), (g).end(), f[i].second) - g.begin()));         if (a.back().first > a.back().second) {           change(a.back().second);           a.back().second += (int)g.size();         }       }       sort((a).begin(), (a).end());       long long tot = 0;       for (int i = 0; i < (int)a.size(); i++) {         tot += go(a[i].first, a[i].second);         change(a[i].second);       }       if (tot <= k) {         r = m;       } else {         l = m;       }     }     printf( %.10lf n , (double)r);   }   