#include <bits/stdc++.h>
using namespace std;
int get(int s) { return s > 1 ? 32 - __builtin_clz(s - 1) : 0; }
namespace NTT {
const long long root = 3;
long long modpow(long long b, long long p) {
  return !p ? 1
            : modpow(b * b % 998244353, p / 2) * (p & 1 ? b : 1) % 998244353;
}
long long inv(long long b) { return modpow(b, 998244353 - 2); }
vector<long long> ntt(vector<long long>& a) {
  int n = a.size(), x = get(n);
  vector<long long> res, RES(n), roots(n);
  roots[0] = 1, roots[1] = modpow(root, (998244353 - 1) / n);
  for (int i = (2); i < (n); i++)
    roots[i] = roots[i - 1] * roots[1] % 998244353;
  res = a;
  for (int i = (1); i < (x + 1); i++) {
    int inc = n >> i;
    for (int j = 0; j < (inc); j++)
      for (int k = 0; k < n; k += inc) {
        int t = 2 * k % n + j;
        RES[k + j] = (res[t] + roots[k] * res[t + inc]) % 998244353;
      }
    swap(res, RES);
  }
  return res;
}
vector<long long> ntt_rev(vector<long long>& a) {
  vector<long long> res = ntt(a);
  long long in = inv(a.size());
  for (int i = 0; i < (res.size()); i++) res[i] = res[i] * in % 998244353;
  reverse(res.begin() + 1, res.end());
  return res;
}
vector<long long> brute(vector<long long>& a, vector<long long>& b) {
  vector<long long> c(a.size() + b.size() - 1);
  for (int i = 0; i < (a.size()); i++)
    for (int j = 0; j < (b.size()); j++)
      c[i + j] = (c[i + j] + a[i] * b[j]) % 998244353;
  return c;
}
vector<long long> conv(vector<long long> a, vector<long long> b) {
  int s = a.size() + b.size() - 1, L = get(s), n = 1 << L;
  if (s <= 0) return {};
  if (s <= 200) return brute(a, b);
  a.resize(n);
  a = ntt(a);
  b.resize(n);
  b = ntt(b);
  for (int i = 0; i < (n); i++) a[i] = a[i] * b[i] % 998244353;
  a = ntt_rev(a);
  a.resize(s);
  return a;
}
}  // namespace NTT
using namespace NTT;
struct Polynomial {
  int deg;
  long long* coefficients;
  Polynomial(int d = 0) {
    deg = d;
    coefficients = new long long[deg + 1];
    memset(coefficients, 0, (deg + 1) * sizeof(long long));
  }
  Polynomial operator()(Polynomial p) {
    Polynomial curr;
    curr[0] = 1;
    Polynomial res;
    for (int i = 0; i < (deg + 1); i++) {
      res += curr * coefficients[i];
      curr *= p;
    }
    return res;
  }
  long long& operator[](int idx) { return coefficients[idx]; }
  Polynomial operator+(long long a) {
    Polynomial p(deg);
    for (int i = 0; i < (deg + 1); i++) p[i] = coefficients[i];
    p[0] += a;
    p[0] %= 998244353;
    return p;
  }
  Polynomial operator-(long long a) {
    Polynomial p(deg);
    for (int i = 0; i < (deg + 1); i++) p[i] = coefficients[i];
    p[0] += 998244353 - a;
    p[0] %= 998244353;
    return p;
  }
  Polynomial operator*(long long mult) {
    Polynomial p(deg);
    for (int i = 0; i < (deg + 1); i++)
      p[i] = coefficients[i] * mult % 998244353;
    return p;
  }
  Polynomial operator/(long long div) {
    return *this * NTT::modpow(div, 998244353 - 2);
  }
  Polynomial operator+(Polynomial b) {
    Polynomial res(max(deg, b.deg));
    for (int i = 0; i < (max(deg, b.deg) + 1); i++)
      res[i] = (((i > deg) ? 0 : coefficients[i]) + ((i > b.deg) ? 0 : b[i])) %
               998244353;
    return res;
  }
  Polynomial operator-(Polynomial p) { return *this + (p * (998244353 - 1)); }
  Polynomial operator*(Polynomial b) {
    vector<long long> va, vb;
    for (int i = 0; i < (deg + 1); i++) va.push_back((*this)[i]);
    for (int i = 0; i < (b.deg + 1); i++) vb.push_back(b[i]);
    vector<long long> vc = NTT::conv(va, vb);
    Polynomial res(vc.size() - 1);
    for (int i = 0; i < (vc.size()); i++) res[i] = vc[i];
    return res;
  }
  void operator+=(long long a) {
    coefficients[0] += a, coefficients[0] %= 998244353;
  }
  void operator-=(long long a) { *this += 998244353 - a; }
  void operator*=(long long mult) {
    for (int i = 0; i < (deg + 1); i++)
      coefficients[i] *= mult, coefficients[i] %= 998244353;
  }
  void operator/=(long long div) { *this *= NTT::modpow(div, 998244353 - 2); }
  void operator+=(Polynomial b) { *this = *this + b; }
  void operator-=(Polynomial p) { *this = *this - p; }
  void operator*=(Polynomial b) { *this = *this * b; }
};
int N, A, B;
long long C(long long n, long long r) {
  long long res = 1;
  long long div = 1;
  for (int i = 0; i < (r); i++) res = res * (n - i) % 998244353;
  for (int i = (1); i < (r + 1); i++) div = div * i % 998244353;
  return res * NTT::modpow(div, 998244353 - 2) % 998244353;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> N >> A >> B;
  if (A + B - 2 > N - 1 || A == 0 || B == 0) {
    cout << 0 << endl;
    return 0;
  }
  queue<Polynomial> q;
  Polynomial strt(0);
  strt[0] = 1;
  q.push(strt);
  for (int i = 0; i < (N - 1); i++) {
    Polynomial mult(1);
    mult[1] = 1;
    mult[0] = i;
    q.push(mult);
  }
  while (q.size() > 1) {
    Polynomial a = q.front();
    q.pop();
    Polynomial b = q.front();
    q.pop();
    q.push(a * b);
  }
  cout << q.front()[A + B - 2] * C(A + B - 2, A - 1) % 998244353 << endl;
  return 0;
}
