https://www.acmicpc.net/problem/8895
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static StringBuilder sb = new StringBuilder();
static Reader scanner = new Reader();
static int n, l, r;
static long[][][] dp;
static void input() {
n = scanner.nextInt();
l = scanner.nextInt();
r = scanner.nextInt();
// dp[stickNum][left][right] = stickNum개의 막대로 왼쪽에서는 left개, 오른쪽에서는 right개의 막대가 보이도록 배치하는 경우의 수
dp = new long[n + 1][n + 1][n + 1];
}
static void solution() {
// stickNum개의 막대들 중 가장 길이가 짧은 막대를 특정 위치에 놓는다고 생각했을 때, 아래와 같은 점화식이 나올 수 있다
// 1. 가장 짧은 막대를 가장 왼쪽에 놓는 경우
// - 가장 왼쪽에 짧은 막대를 놓으면 왼쪽에서 볼 때 막대의 개수가 하나 증가한다
// - 그러므로 dp[stickNum - 1][left - 1][right]개의 경우의 수가 만들어진다
// 2. 가장 짧은 막대를 가장 오른쪽에 놓는 경우
// - 가장 오른에 짧은 막대를 놓으면 오른쪽에서 볼 때 막대의 개수가 하나 증가한다
// - 그러므로 dp[stickNum - 1][left][right - 1]개의 경우의 수가 만들어진다
// 3. 가장 짧은 막대를 위 두 경우가 아닌 곳에 놓는 경우
// - 중간에 짧은 막대를 놓으면 왼쪽이나 오른쪽에서 볼 때 다른 막대들이 가려 막대의 개수가 증가하지 않는다
// - 그러므로 dp[stickNum - 1][left][right] * (stickNum - 2)개의 경우의 수가 만들어진다
// - 여기서 stickNum - 2는 가장 짧은 막대를 세울 수 있는 곳의 개수를 의미한다
// - 가장 왼쪽과 가장 오른쪽을 제외한 모든 곳에 세울 수 있기 때문에 두 곳을 제외한 stickNum - 2개의 위치에 세울 수 있다
// 즉, dp[stickNum][left][right] = dp[stickNum - 1][left - 1][right] + dp[stickNum - 1][left][right - 1] + (dp[stickNum - 1][left][right] * (stickNum - 2))
dp[1][1][1] = 1;
for(int stickNum = 2; stickNum <= n; stickNum++) {
for(int left = 1; left <= stickNum; left++) {
for(int right = 1; right <= stickNum; right++) {
dp[stickNum][left][right] = dp[stickNum - 1][left - 1][right] + dp[stickNum - 1][left][right - 1]
+ (dp[stickNum - 1][left][right] * (stickNum - 2));
}
}
}
sb.append(dp[n][l][r]).append('\n');
}
public static void main(String[] args) {
int T = scanner.nextInt();
while(T-- > 0) {
input();
solution();
}
System.out.print(sb);
}
static class Reader {
BufferedReader br;
StringTokenizer st;
public Reader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while(st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}