#include <bits/stdc++.h>
using namespace std;
const int maxn = 202;
const int logm = 20;
static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
struct point {
  int x, y;
  point(int x = 0, int y = 0) : x(x), y(y) {}
};
struct line {
  int a, b, c;
  line() : a(0), b(0), c(0) {}
  line(const point &p, const point &q)
      : a(p.y - q.y), b(q.x - p.x), c(q.y * p.x - q.x * p.y) {
    int g = gcd(gcd(a, b), c);
    if (g != 1) {
      a /= g;
      b /= g;
      c /= g;
    }
    if (a < 0) {
      a = -a;
      b = -b;
      c = -c;
    }
  }
  inline bool contains(const point &p) { return a * p.x + b * p.y + c == 0; }
  inline bool operator<(const line &other) const {
    return a != other.a   ? a < other.a
           : b != other.b ? b < other.b
                          : c < other.c;
  }
  inline bool operator==(const line &other) const {
    return a == other.a && b == other.b && c == other.c;
  }
};
struct mat {
  static const int N = maxn;
  int sz;
  double a[N][N];
  mat(int sz = N, int id = 0) : sz(sz) {
    for (int i = 0; i < N; ++i)
      for (int j = 0; j < N; ++j) a[i][j] = (i == j ? id : 0);
  }
  inline mat operator*(const mat &other) {
    assert(other.sz == this->sz);
    mat ret(sz, 0);
    for (int i = 0; i < sz; ++i)
      for (int k = 0; k < sz; ++k)
        for (int j = 0; j < sz; ++j)
          ret.a[i][j] += this->a[i][k] * other.a[k][j];
    return ret;
  }
  inline std::vector<double> operator*(const std::vector<double> &u) {
    assert(u.size() == this->sz);
    std::vector<double> v(sz);
    for (int i = 0; i < sz; ++i)
      for (int j = 0; j < sz; ++j) v[i] += a[i][j] * u[j];
    return v;
  }
};
vector<int> pil[maxn * maxn];
vector<int> lcp[maxn * maxn];
vector<line> lines;
point points[maxn];
mat ans[logm];
int n;
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d%d", &points[i].x, &points[i].y);
  }
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) lines.push_back(line(points[i], points[j]));
  sort(lines.begin(), lines.end());
  int num = unique(lines.begin(), lines.end()) - lines.begin();
  for (int i = 0; i < num; i++) {
    for (int j = 0; j < n; j++)
      if (lines[i].contains(points[j])) {
        lcp[i].push_back(j);
        pil[j].push_back(i);
      }
  }
  ans[0] = mat(n, 0);
  for (int i = 0; i < n; i++) {
    for (int j : pil[i])
      for (int k : lcp[j])
        ans[0].a[i][k] += 1.0 / (1.0 * pil[i].size() * lcp[j].size());
  }
  for (int i = 1; i < logm; i++) ans[i] = ans[i - 1] * ans[i - 1];
  int q;
  scanf("%d", &q);
  vector<double> f(n);
  while (q--) {
    int t, m;
    scanf("%d%d", &t, &m);
    t--;
    fill(f.begin(), f.end(), 0);
    f[t] = 1.0;
    for (int i = 0; i < logm; i++)
      if ((m - 1) & (1 << i)) f = ans[i] * f;
    double ret = -1.0;
    for (int i = 0; i < num; i++) {
      double now = 0.0;
      for (int j : lcp[i]) now += f[j];
      now /= lcp[i].size();
      ret = max(ret, now);
    }
    printf("%.12f\n", ret);
  }
}
