#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);     }   }   