#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 = 0;
long double pi = 4 * atan(1.);
long double conv(long double ang) {
  if (ang < -eps) {
    ang += 2 * pi;
  }
  if (ang + eps >= 2 * pi) {
    ang -= 2 * pi;
  }
  return ang;
}
vector<long double> inter(vt a, long double r) {
  if (a.x * a.x + a.y * a.y <= r * r + eps) {
    return {};
  }
  long double d = dst(a);
  long double ang = atan2(a.y, a.x);
  long double alp = acos(r / d);
  return {conv(ang - alp), conv(ang + alp)};
}
vt v[maxn];
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<long double> g;
    vector<pair<long double, long double> > 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(f.back().first);
      g.push_back(f.back().second);
    }
    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);
}
