#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const double eps = 1e-8;
const double pi = acos(-1.0);
template <class T>
struct BIT {
  vector<T> c;
  int n;
  BIT(int sz) { c.resize(1 + (n = sz)); }
  void add(int x, T y) {
    for (; x <= n; x += x & (-x)) c[x] += y;
  }
  T qry(int x) {
    T ans = 0;
    for (; x >= 1; x &= x - 1) ans += c[x];
    return ans;
  }
};
struct point {
  double d, a;
} a[N];
int n, sz;
long long k;
double num[N], ql[N], qr[N];
pair<int, int> it[N];
long long calc(double r) {
  sz = 0;
  double *pos = &num[1];
  for (int i = 1; i <= n; ++i)
    if (a[i].d > r) {
      double e = acos(r / a[i].d);
      sz++;
      ql[sz] = a[i].a - e;
      qr[sz] = a[i].a + e;
      if (ql[sz] < -pi) ql[sz] += 2 * pi;
      if (qr[sz] > pi) qr[sz] -= 2 * pi;
      if (ql[sz] > qr[sz]) swap(ql[sz], qr[sz]);
      *pos++ = ql[sz];
      *pos++ = qr[sz];
    }
  if ((n - sz) * (n - sz - 1ll) / 2 >= k) return k;
  long long ans = 0;
  sort(num + 1, pos);
  for (int i = 1; i <= sz; ++i) {
    it[i].first = lower_bound(num + 1, pos, ql[i]) - num;
    it[i].second = lower_bound(num + 1, pos, qr[i]) - num;
  }
  sort(it + 1, it + sz + 1, [&](pair<int, int> x, pair<int, int> y) {
    return x.first < y.first || (x.first == y.first && x.second > y.second);
  });
  BIT<int> bit(pos - num);
  for (int i = 1; i <= sz; ++i) {
    ans += bit.qry(it[i].second - 1) - bit.qry(it[i].first);
    bit.add(it[i].second, 1);
  }
  ans = n * (n - 1ll) / 2 - ans;
  return ans;
}
int main() {
  scanf("%d%lld", &n, &k);
  double l = 0, r = 0;
  for (int i = 1; i <= n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    a[i].d = sqrt(x * x + y * y);
    a[i].a = atan2(y, x);
    r = max(r, a[i].d);
  }
  while (r - l > eps) {
    double mid = (l + r) / 2;
    if (calc(mid) >= k)
      r = mid;
    else
      l = mid;
  }
  printf("%.10f\n", l);
  return 0;
}
