let MOD = 1000000007
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let (N, L, R) = (input[0], input[1], input[2])
var dp = Array(repeating: Array(repeating: Array(repeating: 0, count: N + 1), count: N + 1), count: N + 1)
dp[1][1][1] = 1
for i in stride(from: 2, through: N, by: 1) {
for j in 1...L {
for k in 1...R {
dp[i][j][k] = (dp[i - 1][j - 1][k] + dp[i - 1][j][k - 1] + dp[i - 1][j][k] * (i - 2)) % MOD
}
}
}
print(dp[N][L][R])
N-1개의 빌딩을 배치하는 모든 경우의 수를 알고 있다고 가정한 후 남은 1개의 빌딩을 어디에 배치해야 할지 생각한다.
이때 이 배치하는 빌딩을 가장 작은 빌딩이라고 생각하면 명확하게 세 가지 경우로 나눌 수 있다.
이 아이디어를 가지고 점화식을 다음과 같이 도출할 수 있다.