Problem: The cool breeze blows gently, the flowing water ripples steadily.

"Flowing and passing like this, the water isn't gone ultimately; Waxing and waning like that, the moon doesn't shrink or grow eventually."

"Everything is transient in a way and perennial in another."

Kanno doesn't seem to make much sense out of Mino's isolated words, but maybe it's time that they enjoy the gentle breeze and the night sky — the inexhaustible gifts from nature.

Gazing into the sky of stars, Kanno indulges in a night's tranquil dreams. 

There is a set S of n points on a coordinate plane.

Kanno starts from a point P that can be chosen on the plane. P is not added to S if it doesn't belong to S. Then the following sequence of operations (altogether called a move) is repeated several times, in the given order:

  1. Choose a line l such that it passes through at least two elements in S and passes through Kanno's current position. If there are multiple such lines, one is chosen equiprobably. 
  2. Move to one of the points that belong to S and lie on l. The destination is chosen equiprobably among all possible ones, including Kanno's current position (if it does belong to S). 



There are q queries each consisting of two integers (t_i, m_i). For each query, you're to help Kanno maximize the probability of the stopping position being the t_i-th element in S after m_i moves with a proper selection of P, and output this maximum probability. Note that according to rule 1, P should belong to at least one line that passes through at least two points from S.

Input

The first line contains a positive integer n (2 ≤ n ≤ 200) — the number of points in S.

The i-th of the following n lines contains two space-separated integers x_i and y_i (-10^4 ≤ x_i, y_i ≤ 10^4) — the coordinates of the i-th point in S. The input guarantees that for all 1 ≤ i < j ≤ n, (x_i, y_i) ≠ (x_j, y_j) holds.

The next line contains a positive integer q (1 ≤ q ≤ 200) — the number of queries.

Each of the following q lines contains two space-separated integers t and m (1 ≤ t_i ≤ n, 1 ≤ m_i ≤ 10^4) — the index of the target point and the number of moves, respectively.

Output

Output q lines each containing a decimal number — the i-th among them denotes the maximum probability of staying on the t_i-th point after m_i steps, with a proper choice of starting position P.

Your answer will be considered correct if each number in your output differs from the corresponding one in jury's answer by at most 10^{-6}.

Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if |a - b| ≤ 10^{-6}.

Example

Input

5
0 0
1 3
2 2
3 1
4 4
10
1 1
2 1
3 1
4 1
5 1
3 2
3 3
3 4
3 5
3 6


Output

0.50000000000000000000
0.50000000000000000000
0.33333333333333331483
0.50000000000000000000
0.50000000000000000000
0.18518518518518517491
0.15226337448559670862
0.14494741655235482414
0.14332164812274550414
0.14296036624949901017

Note

The points in S and possible candidates for line l are depicted in the following figure.

<image>

For the first query, when P = (-1, -3), l is uniquely determined to be 3x = y, and thus Kanno will move to (0, 0) with a probability of \frac 1 2.

For the third query, when P = (2, 2), l is chosen equiprobably between x + y = 4 and x = y. Kanno will then move to the other four points with a probability of \frac 1 2 ⋅ \frac 1 3 = \frac 1 6 each, or stay at (2, 2) with a probability of \frac 1 3.

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;

public class Div2_487E {

	int N;

	public static void main(String[] args) throws IOException {
		new Div2_487E().main();
	}

	Pt[] pts;

	double[][][] pows = new double[16][][];

	void main() throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter printer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		N = Integer.parseInt(reader.readLine());

		pts = new Pt[N];
		for (int i = 0; i < N; i++) {
			StringTokenizer inputData = new StringTokenizer(reader.readLine());
			pts[i] = new Pt(Integer.parseInt(inputData.nextToken()), Integer.parseInt(inputData.nextToken()), i);
		}

		Pt[] srtd = Arrays.copyOf(pts, N);

		double[][] probs = new double[N][N];

		ArrayList<ArrayList<Integer>> sets = new ArrayList<>();

		for (int pI = 0; pI < N; pI++) {
			pivot = pts[pI];
			Arrays.sort(srtd);

			int numL = 0;
			for (int i = 1; i < N; i++) {
				if (i == 1 || srtd[i].compareTo(srtd[i - 1]) != 0) {
					numL++;
				}
			}

			for (int i = 1; i < N;) {
				ArrayList<Integer> cSet = new ArrayList<>();
				sets.add(cSet);
				cSet.add(pivot.i);

				int j = i;
				while (j + 1 < N && srtd[j + 1].compareTo(srtd[i]) == 0) {
					j++;
				}
				int numO = j - i + 2;

				probs[pI][pI] += 1.0 / numL / numO;

				while (i <= j) {
					cSet.add(srtd[i].i);
					probs[pI][srtd[i].i] = 1.0 / numL / numO;
					i++;
				}
				Collections.sort(cSet);
			}
		}

		Collections.sort(sets, lSorter);
		ArrayList<ArrayList<Integer>> nDup = new ArrayList<>();
		for (int i = 0; i < sets.size(); i++) {
			if (i == 0 || lSorter.compare(sets.get(i), sets.get(i - 1)) != 0) {
				nDup.add(sets.get(i));
			}
		}
		// sets = nDup;

		pows[0] = new double[N][N];
		for (int i = 0; i < N; i++) {
			pows[0][i][i] = 1;
		}
		pows[1] = probs;
		for (int i = 2; i < 16; i++) {
			pows[i] = mult(pows[i - 1], pows[i - 1]);
		}

		double[][] trans = new double[N][N];

		int Q = Integer.parseInt(reader.readLine());
		while (Q-- > 0) {
			StringTokenizer inputData = new StringTokenizer(reader.readLine());
			int t = Integer.parseInt(inputData.nextToken()) - 1;
			int m = Integer.parseInt(inputData.nextToken());
			double[] column = new double[N];
			column[t] = 1;
			double[] res = exp(m - 1, column);

			double max = 0;

			for (ArrayList<Integer> cSet : sets) {
				double sum = 0;

				for (int mPt : cSet) {
					sum += res[mPt] / cSet.size();
				}
				max = Math.max(max, sum);
			}
			printer.println(max);
		}
		printer.close();
	}

	Comparator<ArrayList<Integer>> lSorter = new Comparator<ArrayList<Integer>>() {
		public int compare(ArrayList<Integer> l1, ArrayList<Integer> l2) {
			if (l1.size() < l2.size()) {
				return -1;
			}
			if (l1.size() > l2.size()) {
				return 1;
			}

			for (int i = 0; i < l1.size(); i++) {
				int a = l1.get(i);
				int b = l2.get(i);
				if (a < b) {
					return -1;
				}
				if (a > b) {
					return 1;
				}
			}
			return 0;
		}
	};

	double[] exp(int exp, double[] cur) {
		int cPow = 1;
		while (exp > 0) {
			if ((exp & 1) != 0) {
				cur = mult(pows[cPow], cur);
			}
			exp >>= 1;
			cPow++;
		}
		return cur;
	}

	double[][] mult(double[][] a, double[][] b) {
		double[][] res = new double[N][N];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				double sum = 0;
				for (int k = 0; k < N; k++) {
					sum += a[i][k] * b[k][j];
				}
				res[i][j] = sum;
			}
		}
		return res;
	}

	double[] mult(double[][] a, double[] b) {
		double[] res = new double[N];

		for (int i = 0; i < N; i++) {
			double sum = 0;
			for (int j = 0; j < N; j++) {
				sum += a[i][j] * b[j];
			}
			res[i] = sum;
		}
		return res;
	}

	Pt pivot;

	class Pt implements Comparable<Pt> {
		int x, y, i;

		Pt(int x, int y, int i) {
			this.x = x;
			this.y = y;
			this.i = i;
		}

		public int compareTo(Pt o) {
			if (this == pivot) {
				return -1;
			}
			if (o == pivot) {
				return 1;
			}

			long v1x = x - pivot.x;
			long v1y = y - pivot.y;
			if (v1x < 0 || v1x == 0 && v1y > 0) {
				v1x = -v1x;
				v1y = -v1y;
			}

			long v2x = o.x - pivot.x;
			long v2y = o.y - pivot.y;
			if (v2x < 0 || v2x == 0 && v2y > 0) {
				v2x = -v2x;
				v2y = -v2y;
			}
			long i = v1x * v2y - v1y * v2x;

			// HD, Section 2-7
			return (int) ((i >> 63) | (-i >>> 63));
		}
	}

}