#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
struct poi {
  double x, y;
} p[1000005];
long long n, k;
bool vis[1000005];
double tl[1000005], tr[1000005], t[1000005];
long long pp[1000005], trr[1000005], l[1000005], r[1000005];
int cnt = 0, cnt2 = 0;
long long lowbit(int x) { return x & -x; }
void add(int x, int y) {
  for (; x <= cnt; x += lowbit(x)) trr[x] += y;
}
long long query(int x) {
  int ret = 0;
  for (; x; x -= lowbit(x)) ret += trr[x];
  return ret;
}
bool cmp(int a, int b) { return l[a] < l[b]; }
long long check(double R) {
  long long res = 0, in = 0;
  cnt = 0, cnt2 = 0;
  for (int i = 1; i <= n; i++) vis[i] = 0;
  for (int i = 1; i <= n; i++) {
    double x = p[i].x, y = p[i].y, dis = sqrt(x * x + y * y);
    if (dis <= R + eps) {
      in++, vis[i] = 1;
      continue;
    }
    double ang = atan2(y, x), dt = acos(R / dis);
    tl[i] = ang - dt, tr[i] = ang + dt;
    if (tl[i] < -acos(-1)) tl[i] += acos(-1) * 2;
    if (tr[i] > acos(-1)) tr[i] -= acos(-1) * 2;
    if (tl[i] > tr[i]) swap(tl[i], tr[i]);
    t[++cnt] = tl[i], t[++cnt] = tr[i];
  }
  sort(t + 1, t + 1 + cnt);
  memset(trr, 0, sizeof(trr));
  for (long long i = 1; i <= n; i++) {
    if (vis[i]) continue;
    pp[++cnt2] = i;
    l[i] = lower_bound(t + 1, t + 1 + cnt, tl[i]) - t;
    r[i] = lower_bound(t + 1, t + 1 + cnt, tr[i]) - t;
  }
  sort(pp + 1, pp + 1 + cnt2, cmp);
  res = n * (n - 1) / 2;
  for (int i = 1; i <= cnt2; i++) {
    int now = pp[i];
    res -= (query(r[now]) - query(l[now] - 1));
    add(r[now], 1);
  }
  return res;
}
int main() {
  scanf("%lld%lld", &n, &k);
  for (int i = 1; i <= n; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
  double LL = 0, RR = 100000.0;
  while (LL < RR - eps) {
    double mid = (LL + RR) / 2;
    if (check(mid) < k)
      LL = mid;
    else
      RR = mid;
  }
  printf("%.8lf", LL);
}
