import java.util.Scanner;
import java.math.BigDecimal;

public class Main{
	public static void main(String[] args){
		final int MAXN = 40 + 1;
		long dp[][][] = new long[MAXN][MAXN][MAXN * MAXN >> 1];
		long com[][] = new long[MAXN][MAXN];

		dp[0][0][0] = 1;
		for (int i = 0; i < MAXN - 1; ++i)
			for (int j = i; j >= 0; --j)
				for (int k = j * (j + 1) >> 1; k >= 0; --k){
					long t = dp[i][j][k];
					for (int det = 0, l = 1; i + l < MAXN; det += l, ++l)
						dp[i + l][j + l - 1][k + det] += t;
				}
		for (int i = MAXN - 1; i >= 0; --i)
			for (int j = i; j >= 0; --j)
				for (int k = j * (j + 1) >> 1; k >= 0; --k){
					long t = dp[i][j][k];
					dp[i][j][k] = 0;
					for (int det = 0, l = 1; i + l < MAXN; det += l, ++l)
						dp[i + l][j + l - 1][k + det] += t * l;
				}
		for (int i = 0; i < MAXN; ++i){
			com[i][0] = com[i][i] = 1;
			for (int j = 1; j < i; ++j)
				com[i][j] = com[i - 1][j - 1] + com[i - 1][j];
		}

		Scanner in = new Scanner(System.in);
		int cas = in.nextInt();
		while (cas-- > 0){
			int n = in.nextInt(), m = in.nextInt();
			int tot = n * n;
			BigDecimal ans = BigDecimal.ONE;
			for (int i = 0; i < m; ++i){
				BigDecimal ts = BigDecimal.ZERO;
				for (int j = i * (i + 1) >> 1; j >= 0; --j)
					ts = ts.add(BigDecimal.valueOf(dp[n][i][j]).multiply(BigDecimal.valueOf(j)).divide(BigDecimal.valueOf(tot - j), 25, BigDecimal.ROUND_HALF_EVEN));
				ans = ans.add(ts.multiply(BigDecimal.valueOf(com[n - 1 - i][m - 1 - i] * ((m - i & 1) == 1 ? 1 : -1))));
			}
			System.out.println(ans.setScale(12, BigDecimal.ROUND_HALF_UP));
		}
	}
}
