#include #define rep(i,j,k) for (int i=j;i<(k);++i) using namespace std; typedef vector vd; int main() { int n; cin >> n; vector counts(n); unordered_map mapper; float total = 0; rep(i,0,n) { string w; cin >> counts[i] >> w; mapper[w] = i; total += counts[i]; } vector dp(n, vd(n)); if (n==1) { dp[0][0] = 1; } else if (n==2) { float a0 = counts[0] / total; dp[0][0] = a0; dp[1][0] = 1-a0; dp[0][1] = dp[1][1] = 1; } else { rep(i,0,n) { rep(j,i+1,n) { rep(k,j+1,n) { float sub = counts[i] * counts[j] * counts[k]; float ijk = 1 / total / (total - counts[i]) / (total - counts[i] - counts[j]); float ikj = 1 / total / (total - counts[i]) / (total - counts[i] - counts[k]); float jik = 1 / total / (total - counts[j]) / (total - counts[j] - counts[i]); float jki = 1 / total / (total - counts[j]) / (total - counts[j] - counts[k]); float kij = 1 / total / (total - counts[k]) / (total - counts[k] - counts[i]); float kji = 1 / total / (total - counts[k]) / (total - counts[k] - counts[j]); dp[i][0] += sub*(ijk + ikj); dp[i][1] += sub*(jik + kij); dp[i][2] += sub*(jki + kji); dp[j][0] += sub*(jik + jki); dp[j][1] += sub*(ijk + kji); dp[j][2] += sub*(ikj + kij); dp[k][0] += sub*(kij + kji); dp[k][1] += sub*(ikj + jki); dp[k][2] += sub*(ijk + jik); float comb = sub*(ijk + ikj + jik + jki + kij + kji); int ind=2; rep(x,0,n) if (x!=i && x!=j && x!=k) dp[x][++ind] += comb; } } } // prefix sum i is in top j rep(i,0,n) rep(j,1,n) { dp[i][j] += dp[i][j-1]; } } // queries int q; cin >> q; while (q--) { string w; int p; cin >> w >> p; printf("%.12f\n", dp[mapper[w]][--p]); } return 0; }