#include <bits/stdc++.h>
using namespace std;
vector<vector<double> > M, I;
vector<vector<double> > M2[15];
int X[203], Y[203];
int sz = 0;
map<pair<int, int>, int> mp;
map<pair<pair<int, int>, int>, int> conv;
vector<int> vec[40003];
int gcd(int a, int b) { return (b == 0) ? a : gcd(b, a % b); }
vector<vector<double> > operator*(vector<vector<double> > A,
                                  vector<vector<double> > B) {
  vector<vector<double> > C =
      vector<vector<double> >(A.size(), vector<double>(B[0].size(), 0));
  for (int i = 1; i < A.size(); i++)
    for (int j = 1; j < B[0].size(); j++)
      for (int k = 1; k < B.size(); k++) C[i][j] += A[i][k] * B[k][j];
  return C;
}
vector<vector<double> > pwr(vector<vector<double> > A, int b) {
  if (!b)
    return I;
  else if (b == 1)
    return A;
  else if (b == 2)
    return A * A;
  else if (b & 1)
    return pwr(A, b - 1) * A;
  else
    return pwr(pwr(A, b / 2), 2);
}
void print(vector<vector<double> > X) {
  for (int i = 1; i < X.size(); i++) {
    for (int j = 1; j < X[i].size(); j++) printf("%.8lf ", X[i][j]);
    printf("\n");
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d %d", &X[i], &Y[i]);
  M.assign(n + 1, vector<double>(n + 1, 0));
  I.assign(n + 1, vector<double>(n + 1, 0));
  for (int i = 1; i <= n; i++) {
    I[i][i] = 1;
    mp.clear();
    for (int j = 1; j <= n; j++) {
      if (j == i) continue;
      int x = X[j] - X[i];
      int y = Y[j] - Y[i];
      if (x < 0) x = -x, y = -y;
      pair<int, int> m;
      if (x == 0)
        m = {1, 0};
      else if (y == 0)
        m = {0, 1};
      else
        m = {y / gcd(x, abs(y)), x / gcd(x, abs(y))};
      mp[m]++;
    }
    for (int j = 1; j <= n; j++) {
      if (j == i) continue;
      int x = X[j] - X[i];
      int y = Y[j] - Y[i];
      if (x < 0) x = -x, y = -y;
      pair<int, int> m;
      if (x == 0)
        m = {1, 0};
      else if (y == 0)
        m = {0, 1};
      else
        m = {y / gcd(x, abs(y)), x / gcd(x, abs(y))};
      M[i][j] = (1.0 / mp.size()) * 1.0 / (1.0 + mp[m]);
    }
    for (auto x : mp) M[i][i] += (1.0 / mp.size()) * 1.0 / (1.0 + x.second);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      int a = X[j] - X[i];
      int b = Y[j] - Y[i];
      if (a < 0) a = -a, b = -b;
      int fpb = gcd(a, abs(b));
      pair<int, int> m;
      if (a == 0)
        m = {1, 0};
      else if (b == 0)
        m = {0, 1};
      else
        m = {b / fpb, a / fpb};
      if (fpb) {
        a /= fpb;
        b /= fpb;
      }
      int c = a * Y[i] - b * X[i];
      if (conv.find({m, c}) == conv.end()) {
        conv[{m, c}] = ++sz;
        int idx = conv[{m, c}];
        for (int k = 1; k <= n; k++)
          if (a * Y[k] == b * X[k] + c) vec[idx].push_back(k);
      }
    }
  }
  M2[0] = M;
  for (int i = 1; i < 15; i++) M2[i] = M2[i - 1] * M2[i - 1];
  int q;
  scanf("%d", &q);
  while (q--) {
    int x, m;
    scanf("%d %d", &x, &m);
    vector<vector<double> > s =
        vector<vector<double> >(n + 1, vector<double>(2, 0));
    s[x][1] = 1;
    for (int i = 0; i < 15; i++)
      if ((m - 1) & (1 << i)) s = M2[i] * s;
    double mx = 0;
    for (int i = 1; i <= sz; i++) {
      double sum = 0;
      for (auto j : vec[i]) sum += s[j][1];
      sum *= 1.0 / vec[i].size();
      mx = max(mx, sum);
    }
    printf("%.9lf\n", mx);
  }
}
