#include <bits/stdc++.h>
using namespace std;
const long long mo = 998244353;
const long long g = 3;
const int N = 500000;
int n, ax, bx, rev[N + 10];
long long aa[N + 10], bb[N + 10], c[N + 10], fac[N + 10], inv[N + 10];
long long mul(long long x, long long y) {
  long long z = 1;
  while (y) {
    if (y & 1) z = z * x % mo;
    y >>= 1;
    x = x * x % mo;
  }
  return z;
}
struct poly {
  vector<int> a;
  void pre(int n) {
    rev[0] = 0;
    for (int i = 1; i < n; i++)
      if (i & 1)
        rev[i] = rev[i ^ 1] + (n >> 1);
      else
        rev[i] = rev[i >> 1] >> 1;
  }
  void FFT(long long *a, int n) {
    for (int i = 0; i < n; i++) c[rev[i]] = a[i];
    for (int i = 2; i <= n; i <<= 1) {
      long long wn = mul(g, (mo - 1) / i);
      for (int j = 0; j < n; j += i) {
        long long w = 1;
        for (int k = j; k < j + i / 2; k++, w = wn * w % mo) {
          long long ck = c[k];
          c[k] = (ck + w * c[k + i / 2]) % mo;
          c[k + i / 2] = (ck - w * c[k + i / 2]) % mo;
        }
      }
    }
    for (int i = 0; i < n; i++) a[i] = (c[i] + mo) % mo;
  }
  void IFFT(long long *a, int n) {
    FFT(a, n);
    for (int i = 1; i < n / 2; i++) swap(a[i], a[n - i]);
    long long invn = mul(n, mo - 2);
    for (int i = 0; i < n; i++) a[i] = a[i] * invn % mo;
  }
  poly operator*(poly &p) {
    int sz = a.size() + p.a.size() - 1;
    int nx = 1;
    while (nx < sz) nx <<= 1;
    pre(nx);
    for (int i = 0; i < nx; i++) {
      if (i < (int)a.size())
        aa[i] = a[i];
      else
        aa[i] = 0;
      if (i < (int)p.a.size())
        bb[i] = p.a[i];
      else
        bb[i] = 0;
    }
    FFT(aa, nx);
    FFT(bb, nx);
    for (int i = 0; i < nx; i++) aa[i] = aa[i] * bb[i] % mo;
    IFFT(aa, nx);
    poly ans;
    ans.a.clear();
    for (int i = 0; i < sz; i++) ans.a.push_back(aa[i]);
    return ans;
  }
};
void prework() {
  fac[0] = 1;
  for (int i = 1; i <= N; i++) fac[i] = fac[i - 1] * i % mo;
  inv[N] = mul(fac[N], mo - 2);
  for (int i = N - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mo;
}
poly Calc_Stirling(int l, int r) {
  poly f;
  f.a.clear();
  if (l > r) {
    f.a.push_back(1);
    return f;
  }
  if (l == r) {
    f.a.push_back(l);
    f.a.push_back(1);
    return f;
  }
  int mid = (l + r) / 2;
  f = Calc_Stirling(l, mid);
  poly g = Calc_Stirling(mid + 1, r);
  f = f * g;
  return f;
}
int main() {
  scanf("%d%d%d", &n, &ax, &bx);
  if (ax == 0 || bx == 0) {
    printf("0\n");
    return 0;
  }
  prework();
  poly f = Calc_Stirling(0, n - 2);
  long long ans;
  if (ax + bx - 2 < (int)f.a.size())
    ans = f.a[ax + bx - 2];
  else
    ans = 0;
  ans =
      (ans * fac[ax + bx - 2] % mo * inv[ax - 1] % mo * inv[bx - 1] % mo + mo) %
      mo;
  printf("%lld\n", ans);
  return 0;
}
