Problem: The commanding officers decided to drop a nuclear bomb on the enemy's forces. You are ordered to determine the power of the warhead that needs to be used.

The enemy has N strategically important objects. Their positions are known due to the intelligence service. The aim of the strike is to deactivate at least K important objects of the enemy. The bombing impact point is already determined and has coordinates of [X0; Y0].

The nuclear warhead is marked by the estimated impact radius R ≥ 0. All the buildings that are located closer than R to the bombing epicentre will be destroyed. All the buildings that are located further than R from the epicentre, can also be deactivated with some degree of probability. Let's assume that D is the distance between a building and the epicentre. This building's deactivation probability P(D, R) is calculated according to the following formula: 

<image> We should regard <image> as ea, where e ≈ 2.7182818284590452353602874713527

If the estimated impact radius of the warhead is equal to zero, then all the buildings located in the impact point will be completely demolished and all the rest of important objects will not be damaged.

The commanding officers want the probability of failing the task to be no more than ε. Nuclear warheads are too expensive a luxury, that's why you have to minimise the estimated impact radius of the warhead. 

Input

The first line contains an integer N which represents the number of the enemy's objects (1 ≤ N ≤ 100). The second line contains two integers: K is the required number of deactivated objects, and ε is the maximally permitted probability of not completing the task, given in per mils (1 ≤ K ≤ N, 1 ≤ ε ≤ 999). The third line contains X0 and Y0 which are the coordinates of the strike impact point. The next N lines contain two numbers Xi and Yi each which are the coordinates of every strategically important object. All the coordinates are integer, their absolute values do not exceed 1000.

Let us remind you that there are a thousand per mils in unity (number one).

There can be several objects in one point.

Output

Print the sought estimated impact radius of the warhead. The absolute or relative measure of the inaccuracy of your answer should not exceed 10 - 6.

Examples

Input

1
1 500
5 5
1 2


Output

3.84257761518762740


Input

5
3 100
0 0
3 4
60 70
100 100
10 10
5 12


Output

13.45126176453737600

Solution (in JAVA):

Solution:
import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class D implements Runnable {

    // leave empty to read from stdin/stdout
    private static final String TASK_NAME_FOR_IO = "";

    // file names
    private static final String FILE_IN = TASK_NAME_FOR_IO + ".in";
    private static final String FILE_OUT = TASK_NAME_FOR_IO + ".out";

    BufferedReader in;
    PrintWriter out;
    StringTokenizer tokenizer = new StringTokenizer("");

    public static void main(String[] args) {
        new Thread(new D()).start();
    }

    int n, k, x0, y0;
    double targetSuccess;
    int[] x, y;
    double[] dst;

    double EPS = 1e-9;
    double EPS_PRECISE = 1e-12;

    double answer = Double.POSITIVE_INFINITY;

    private void solve() throws IOException {
        n = nextInt();
        k = nextInt();
        targetSuccess = 1.0 - (nextInt() / 1000.0);

        x0 = nextInt();
        y0 = nextInt();
        x = new int[n];
        y = new int[n];
        dst = new double[n];
        for (int i = 0; i < n; i++) {
            x[i] = nextInt();
            y[i] = nextInt();
        }

        List<Double> criticalPoints = new ArrayList<Double>();
        criticalPoints.add(0.0);
        criticalPoints.add(1e10);
        for (int i = 0; i < n; i++) {
            dst[i] = dist(x[i], y[i], x0, y0);
            criticalPoints.add(dst[i]);
        }

        probSuccess = new double[n];
        Collections.sort(criticalPoints);
        for (int i = 0; i < criticalPoints.size() - 1; i++) {
            double lo = criticalPoints.get(i);
            double hi = criticalPoints.get(i + 1);

            xtryNeighbours(lo);
            xtryNeighbours(hi);

            for (int j = 0; j < 77; j++) {
                double mid = (lo + hi) / 2.0;
                if (good(mid)) {
                    update(mid);
                    hi = mid;
                } else {
                    lo = mid;
                }
            }

            xtryNeighbours(lo);
            xtryNeighbours(hi);
        }

        out.printf("%.17f", answer);
    }

    private void xtryNeighbours(double x) {
        xtry(x - EPS);
        xtry(x);
        xtry(x + EPS);
    }

    private void xtry(double v) {
        if (good(v)) {
            update(v);
        }
    }

    private void update(double v) {
        if (v < answer) {
            answer = v;
        }
    }

    double[] probSuccess;

    private boolean good(double r) {
        Arrays.fill(probSuccess, 0.0);
        for (int i = 0; i < n; i++) {
            if (Math.abs(r) < EPS_PRECISE) {
                if (Math.abs(dst[i]) < EPS_PRECISE) {
                    probSuccess[i] = 1.0;
                } else {
                    probSuccess[i] = 0.0;
                }
            } if (dst[i] + EPS_PRECISE < r) {
                probSuccess[i] = 1.0;
            } else {
                probSuccess[i] = Math.exp(1.0 - (dst[i] * dst[i]) / (r * r));
            }
        }

        Arrays.sort(probSuccess);

        double[][] d = new double[n + 1][n + 1];
        d[0][0] = 1.0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (d[i][j] > -EPS) {
                    d[i + 1][j + 1] += d[i][j] * probSuccess[i];
                    d[i + 1][j] += d[i][j] * (1.0 - probSuccess[i]);
                }

        double pSum = 0.0;
        for (int j = k; j <= n; j++) {
            pSum += d[n][j];
        }
        return pSum > targetSuccess - EPS;


        /*
        double totalProbSuccess = 1.0;
        for (int i = 0; i < k; i++) {
            totalProbSuccess *= probSuccess[n - 1 - i];
        }

        return totalProbSuccess > targetSuccess;
        */

        /*
        int count = 0;
        for (int i = 0; i < n; i++)
            if (probSuccess[i] - EPS > targetSuccess) {
                count++;
            }
        return count >= k;
        */
    }

    private double dist(int x1, int y1, int x2, int y2) {
        double dx = x1 - x2;
        double dy = y1 - y2;
        return Math.sqrt(dx * dx + dy * dy);
    }

    public void run() {
        long timeStart = System.currentTimeMillis();
        try {

            if (TASK_NAME_FOR_IO.length() > 0) {
                in = new BufferedReader(new FileReader(FILE_IN));
                out = new PrintWriter(new FileWriter(FILE_OUT));
            } else {
                in = new BufferedReader(new InputStreamReader(System.in));
                out = new PrintWriter(new OutputStreamWriter(System.out));
            }

            solve();

            in.close();
            out.close();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        long timeEnd = System.currentTimeMillis();
        System.out.println("Time spent: " + (timeEnd - timeStart) + " ms");
    }

    private String nextToken() throws IOException {
        while (!tokenizer.hasMoreTokens()) {
            String line = in.readLine();
            if (line == null) {
                return null;
            }
            tokenizer = new StringTokenizer(line);
        }
        return tokenizer.nextToken();
    }

    private int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }

    private BigInteger nextBigInt() throws IOException {
        return new BigInteger(nextToken());
    }

    private long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

    private double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }

}