#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
using namespace std;
const int P = 998244353;
const int G = 3;
const int Gi = (P + 1) / G;
inline long long quickpow(long long x, int k) {
  long long res = 1;
  while (k) {
    if (k & 1) res = res * x % P;
    x = x * x % P;
    k >>= 1;
  }
  return res;
}
int n;
long long jie[401000], jieni[401000];
inline void init() {
  jie[0] = jieni[0] = 1;
  for (int i = 1; i <= n; ++i) jie[i] = jie[i - 1] * i % P;
  jieni[n] = quickpow(jie[n], P - 2);
  for (int i = n - 1; i; --i) jieni[i] = jieni[i + 1] * (i + 1) % P;
}
inline long long get_c(int n, int m) {
  if (n < 0 || m < 0 || n - m < 0) return 0;
  return jie[n] * jieni[m] % P * jieni[n - m] % P;
}
int r[401000];
inline void ntt(long long *a, int limi, int type) {
  for (int i = 1; i < limi; ++i)
    if (i < r[i]) swap(a[i], a[r[i]]);
  for (int i = 1; i < limi; i <<= 1) {
    long long T = quickpow(type == 1 ? G : Gi, (P - 1) / (i << 1));
    for (int j = 0; j < limi; j += (i << 1)) {
      long long t = 1;
      for (int k = 0; k < i; ++k, t = t * T % P) {
        long long nx = a[j + k], ny = t * a[j + k + i] % P;
        a[j + k] = (nx + ny) % P;
        a[i + j + k] = (nx - ny + P) % P;
      }
    }
  }
  if (type == -1) {
    long long inv = quickpow(limi, P - 2);
    for (int i = 0; i < limi; ++i) a[i] = a[i] * inv % P;
  }
}
long long sol_A[401000], sol_B[401000];
void sol(long long *a, int al, int ar) {
  if (al == ar) {
    a[0] = al, a[1] = 1;
    return;
  }
  int mid = (al + ar) >> 1;
  int llen = (mid - al + 1) << 1, rlen = (ar - mid) << 1,
      totlen = (ar - al + 1) << 1;
  sol(a, al, mid);
  sol(a + llen, mid + 1, ar);
  for (int i = 0; i < llen; ++i) sol_A[i] = a[i];
  for (int i = 0; i < rlen; ++i) sol_B[i] = a[llen + i];
  int limi = 1, L = 0;
  while (limi <= llen + rlen) limi <<= 1, ++L;
  for (int i = 1; i < limi; ++i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (L - 1));
  ntt(sol_A, limi, 1), ntt(sol_B, limi, 1);
  for (int i = 0; i < limi; ++i)
    sol_A[i] = sol_A[i] * sol_B[i] % P, sol_B[i] = 0;
  ntt(sol_A, limi, -1);
  for (int i = 0; i < totlen; ++i) a[i] = sol_A[i];
  for (int i = 0; i < limi; ++i) sol_A[i] = 0;
}
long long A[401000];
int main() {
  read(n);
  int a, b;
  read(a), read(b);
  if (!a || !b || a + b - 2 > n - 1) {
    puts("0");
    return 0;
  }
  if (n == 1) {
    puts("1");
    return 0;
  }
  init();
  sol(A, 0, n - 2);
  long long ans = A[a + b - 2] * get_c(a + b - 2, a - 1) % P;
  printf("%lld\n", (ans % P + P) % P);
  return 0;
}
