#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const double eps = 1e-9;
const double pi = acos(-1);
struct P {
  int x, y;
} a[N];
int n, vi[N], t[N];
double l[N], r[N], q[N];
long long k;
void change(int k, int v) {
  for (; k; k -= k & (-k)) t[k] += v;
}
int ask(int k) {
  int s = 0;
  for (; k < N; k += k & (-k)) s += t[k];
  return s;
}
struct node {
  double p1, p2;
  int v;
} op[N * 2];
bool cmp(node a, node b) { return a.p1 < b.p1; }
long long count(double R) {
  int top = 0, op_top = 0;
  memset(t, 0, sizeof(t));
  for (int i = (int)(1); i <= (int)(n); i++) {
    l[i] = r[i] = -1;
    double d = sqrt(a[i].x * a[i].x + a[i].y * a[i].y);
    if (d < R + eps) continue;
    double theta = atan2(a[i].y, a[i].x);
    double delta = acos(R / d);
    l[i] = theta - delta;
    r[i] = theta + delta;
    for (; l[i] < 0; l[i] += 2 * pi)
      ;
    for (; r[i] < 0; r[i] += 2 * pi)
      ;
    for (; l[i] >= 2 * pi; l[i] -= 2 * pi)
      ;
    for (; r[i] >= 2 * pi; r[i] -= 2 * pi)
      ;
    if (l[i] > r[i]) swap(l[i], r[i]);
    q[++top] = l[i];
    op[++op_top] = (node){l[i], l[i], 1};
    op[++op_top] = (node){r[i], l[i], -1};
  }
  sort(q + 1, q + top + 1);
  sort(op + 1, op + op_top + 1, cmp);
  long long sum = 0;
  for (int i = (int)(1); i <= (int)(op_top); i++) {
    int p = lower_bound(q + 1, q + top + 1, op[i].p2) - q;
    change(p, op[i].v);
    if (op[i].v == -1) sum += ask(p);
  }
  return sum;
}
int main() {
  scanf("%d%lld", &n, &k);
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%d%d", &a[i].x, &a[i].y);
  double l = 0, r = 15000;
  for (int T = (int)(1); T <= (int)(50); T++) {
    double mid = (l + r) / 2;
    if (1ll * n * (n - 1) / 2 - count(mid) < k)
      l = mid;
    else
      r = mid;
  }
  printf("%.10lf\n", (l + r) / 2);
}
