#include <bits/stdc++.h>
namespace IO {
template <typename _T>
inline bool read(_T &x) {
  x = 0;
  _T y = 1;
  char c = getchar();
  while ((c < '0' || '9' < c) && c != EOF) {
    if (c == '-') y = -1;
    c = getchar();
  }
  if (c == EOF) return false;
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getchar();
  x *= y;
  return true;
}
template <typename _T>
inline _T input() {
  _T x = 0, y = 1;
  char c = getchar();
  while ((c < '0' || '9' < c) && c != EOF) {
    if (c == '-') y = -1;
    c = getchar();
  }
  if (c == EOF) return 0;
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getchar();
  x *= y;
  return x;
}
};  // namespace IO
using namespace IO;
inline int add(int x, int y) {
  x += y;
  return x >= 998244353 ? x - 998244353 : x;
}
inline int mul(int x, int y) { return 1LL * x * y % 998244353; }
inline int qpow(int x, int y) {
  int ans = 1;
  for (; y; y >>= 1, x = mul(x, x))
    if (y & 1) ans = mul(ans, x);
  return ans;
}
const int LEN = 1 << 18;
int rev[200007 << 1], gx[200007 << 1], igx[200007 << 1];
inline void Ginit() {
  for (int i = 1; i <= LEN; i <<= 1)
    gx[i] = qpow(3, (998244353 - 1) / (i << 1)),
    igx[i] = qpow(gx[i], 998244353 - 2);
}
inline int config(int n) {
  int m = 1, _l = 0;
  while (m < n * 2) m <<= 1, _l++;
  for (int i = 0; i < m; ++i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << _l - 1);
  return m;
}
inline void NTT(int *A, int lim, int tp) {
  for (int i = 0; i < lim; ++i)
    if (i < rev[i]) std::swap(A[i], A[rev[i]]);
  for (int l = 1; l < lim; l <<= 1) {
    int gn = (tp == 1 ? gx[l] : igx[l]);
    for (int i = 0, L = l << 1; i < lim; i += L) {
      for (int j = i, x, y, g = 1; j < i + l; j++, g = mul(g, gn)) {
        x = A[j], y = mul(A[j + l], g);
        A[j] = add(x, y), A[j + l] = add(x, 998244353 - y);
      }
    }
  }
  if (tp == 1) return;
  int inv = qpow(lim, 998244353 - 2);
  for (int i = 0; i < lim; ++i) A[i] = mul(A[i], inv);
}
int fac[200007 << 1], ifac[200007 << 1];
int b[200007 << 1], c[200007 << 1];
inline void getStirling(int deg, int *a) {
  if (deg == 1) return a[1] = 1, void();
  if (deg & 1) {
    getStirling(deg - 1, a);
    for (int i = deg; i >= 1; --i) a[i] = add(a[i - 1], mul(a[i], deg - 1));
    return;
  }
  getStirling(deg >> 1, a);
  int len = deg >> 1;
  int m = config(deg + 1);
  for (int i = 0; i <= len; ++i) b[i] = mul(a[i], fac[i]);
  for (int i = len + 1; i < m; ++i) b[i] = 0;
  for (int i = 0; i <= len; ++i) c[i] = mul(qpow(len, i), ifac[i]);
  for (int i = len + 1; i < m; ++i) c[i] = 0;
  std::reverse(c, c + len + 1);
  NTT(b, m, 1), NTT(c, m, 1);
  for (int i = 0; i < m; ++i) b[i] = mul(b[i], c[i]);
  NTT(b, m, -1);
  for (int i = 0; i <= len; ++i) b[i] = b[i + len];
  m = config(deg);
  for (int i = len + 1; i < m; ++i) b[i] = 0;
  for (int i = 0; i <= len; ++i) b[i] = mul(b[i], ifac[i]);
  NTT(a, m, 1), NTT(b, m, 1);
  for (int i = 0; i < m; ++i) a[i] = mul(a[i], b[i]);
  NTT(a, m, -1);
  for (int i = deg + 1; i < m; ++i) a[i] = 0;
}
int N, x, y;
int a[200007 << 1];
inline int C(int x, int y) {
  if (y < 0 || x < y) return 0;
  return mul(fac[x], mul(ifac[y], ifac[x - y]));
}
int main() {
  Ginit();
  read(N), read(x), read(y);
  if (N == 1) return puts(x == 1 && y == 1 ? "1" : "0"), 0;
  if (x + y - 2 >= N) return puts("0"), 0;
  N--;
  fac[0] = ifac[0] = 1;
  for (int i = 1; i <= N; ++i) fac[i] = mul(fac[i - 1], i);
  ifac[N] = qpow(fac[N], 998244353 - 2);
  for (int i = N - 1; i >= 1; --i) ifac[i] = mul(ifac[i + 1], i + 1);
  getStirling(N, a);
  printf("%d\n", mul(a[x + y - 2], C(x + y - 2, x - 1)));
  return 0;
}
