#include <bits/stdc++.h>
using namespace std;
struct type {
  double x;
  int id;
} b[200001];
struct Type {
  int x, y;
} c[100001];
double X[100001], Y[100001], dis[100001], S[100001], L, R, Mid;
int tr[200001], n, i, j, k, l;
long long K;
void change(int t, int s) {
  while (t <= n * 2) tr[t] += s, t += ((t) & -(t));
}
int find(int t) {
  int ans = 0;
  while (t) ans += tr[t], t -= ((t) & -(t));
  return ans;
}
bool cmp(type a, type b) { return a.x < b.x; }
bool Cmp(Type a, Type b) { return a.x < b.x; }
bool pd(double r) {
  double s1, s2, ss, s;
  long long sum = 0;
  l = 0;
  for (i = 1; i <= n; i++)
    if (dis[i] > r) {
      s = acos(r / dis[i]);
      s1 = S[i] - s, s2 = S[i] + s;
      if (s1 < 0) s1 += 3.14159265358979323846 * 2;
      if (s2 > 3.14159265358979323846 * 2) s2 -= 3.14159265358979323846 * 2;
      if (s1 > s2) ss = s1, s1 = s2, s2 = ss;
      b[++l] = {s1, -i}, b[++l] = {s2, i};
    }
  if (l) {
    for (i = 1; i <= n; i++) c[i] = {1, 0};
    sort(b + 1, b + l + 1, cmp);
    for (i = 1; i <= l; i++) {
      if (b[i].id < 0)
        c[-b[i].id].x = i;
      else
        c[b[i].id].y = i;
    }
    l = 0;
    for (i = 1; i <= n; i++)
      if (c[i].x <= c[i].y) c[++l] = c[i];
    sort(c + 1, c + l + 1, Cmp);
    memset(tr, 0, sizeof(tr));
    for (i = l; i >= 1; i--) {
      sum += find(c[i].y);
      change(c[i].x, 1), change(c[i].y, -1);
    }
  }
  sum = 1ll * n * (n - 1) / 2 - sum;
  return sum >= K;
}
int main() {
  scanf("%d%lld", &n, &K);
  for (i = 1; i <= n; i++) {
    scanf("%lf%lf", &X[i], &Y[i]), dis[i] = sqrt(X[i] * X[i] + Y[i] * Y[i]),
                                   S[i] = atan2(Y[i], X[i]);
    if (S[i] < 0) S[i] += 3.14159265358979323846 * 2;
  }
  L = 0, R = 20000;
  while (R - L > 0.000000001) {
    Mid = (L + R) / 2;
    if (!pd(Mid))
      L = Mid;
    else
      R = Mid;
  }
  printf("%.15lf\n", L);
  fclose(stdin);
  fclose(stdout);
  return 0;
}
