#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  while ((c < '0' || c > '9') && c - '-') c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + c - 48;
    c = getchar();
  }
  return x * f;
}
const int N = 3e5 + 10;
int n, rev[N];
long long f[N], g[N], jc[N], inv[N], z[N];
const long long mo = 998244353, Gi = 3;
inline long long qp(long long a, long long b) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a) % mo;
    a = (a * a) % mo;
    b >>= 1;
  }
  return ans;
}
int lim = 1, l = 0;
inline void ntt(long long a[], int pan) {
  for (int i = 0; i < lim; i++)
    if (i > rev[i]) swap(a[i], a[rev[i]]);
  for (int bj = 1; bj < lim; bj <<= 1) {
    long long wn = qp(Gi, (mo - 1) / (bj << 1));
    if (pan) wn = qp(wn, mo - 2);
    for (int ks = 0; ks < lim; ks += (bj << 1)) {
      long long w = 1;
      for (int i = 0; i < bj; i++, w = (w * wn) % mo) {
        long long x = a[ks + i], y = w * a[ks + i + bj] % mo;
        a[ks + i] = (x + y) % mo;
        a[ks + i + bj] = ((x - y) % mo + mo) % mo;
      }
    }
  }
  if (pan) {
    long long ni = qp(lim, mo - 2);
    for (int i = 0; i < lim; i++) a[i] = (a[i] * ni) % mo;
  }
}
void gao(int t) {
  if (t == 1) {
    f[1] = 1;
    return;
  }
  int mi = t / 2;
  gao(mi);
  for (int i = 0; i <= mi; i++) z[i] = f[i], f[i] = f[i] * jc[i] % mo;
  long long c = mi, gu = 1;
  g[mi] = inv[0];
  for (int i = mi - 1; i >= 0; i--) {
    gu = (gu * c) % mo;
    g[i] = gu * inv[mi - i] % mo;
  }
  lim = 1, l = 0;
  while (lim <= (mi << 1)) lim <<= 1, l++;
  for (int i = 0; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
  ntt(f, 0);
  ntt(g, 0);
  for (int i = 0; i < lim; i++) f[i] = (f[i] * g[i]) % mo, g[i] = 0;
  ntt(f, 1);
  long long ji = f[mi];
  for (int i = mi; i >= 1; i--) {
    f[i] = f[i + mi];
    f[i + mi] = 0;
  }
  f[0] = ji;
  for (int i = 0; i <= mi; i++) f[i] = (f[i] * inv[i]) % mo;
  lim = 1, l = 0;
  while (lim <= (mi << 1)) lim <<= 1, l++;
  for (int i = 0; i < lim; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);
  ntt(z, 0);
  ntt(f, 0);
  for (int i = 0; i < lim; i++) z[i] = (z[i] * f[i]) % mo;
  ntt(z, 1);
  for (int i = 0; i < lim; i++) f[i] = z[i], z[i] = 0;
  if (t % 2) {
    z[0] = (f[0] * (t - 1)) % mo;
    for (int i = 1; i <= (mi << 1) + 1; i++)
      z[i] = (f[i - 1] + (f[i] * (t - 1))) % mo;
    for (int i = 1; i <= (mi << 1) + 1; i++) f[i] = z[i], z[i] = 0;
  }
}
int A, B;
int main() {
  jc[0] = inv[0] = 1;
  for (int i = 1; i <= N - 10; i++) jc[i] = (jc[i - 1] * i) % mo;
  inv[N - 10] = qp(jc[N - 10], mo - 2);
  for (int i = N - 11; i >= 1; i--) inv[i] = (inv[i + 1] * (i + 1)) % mo;
  n = read();
  A = read();
  B = read();
  if (n == 1) {
    if (A + B == 2)
      cout << "1\n";
    else
      cout << "0\n";
    return 0;
  }
  if (!A || !B || A + B > n + 1) {
    cout << "0\n";
    return 0;
  }
  gao(n - 1);
  cout << f[A + B - 2] * jc[A + B - 2] % mo * inv[A - 1] % mo * inv[B - 1] % mo
       << "\n";
  return 0;
}
