#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline void mine(T1 &x, T2 y) {
  if (x > y) x = y;
}
template <typename T1, typename T2>
inline void maxe(T1 &x, T2 y) {
  if (x < y) x = y;
}
ostream &operator<<(ostream &a, const vector<int> &b) {
  for (auto k : b) cout << k << ' ';
  return a;
}
const int MOD = 998244353;
const int INF = 1000000050;
const long long BIG = (long long)2e18 + 50;
const int LOG = 19;
const int N = 1 << LOG;
const int NN = N + 5;
const double PI = 4 * atan(1);
const double EPS = 1e-9;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
long long add(long long a, long long b) {
  a += b;
  if (a >= MOD) return a - MOD;
  return a;
}
long long sub(long long a, long long b) {
  a -= b;
  if (a < 0) return a + MOD;
  return a;
}
long long mult(long long a, long long b) { return a * b % MOD; }
long long powmod(long long a, long long p) {
  if (p == 0) return 1;
  if (p & 1) return mult(a, powmod(a, p - 1));
  return powmod(mult(a, a), p / 2);
}
long long rev(long long a) { return powmod(a, MOD - 2); }
int f[NN];
int f1[NN];
int C(int n, int k) {
  if (k < 0 || n < k) return 0;
  int res = mult(mult(f[n], f1[k]), f1[n - k]);
  ;
  return res;
}
int w[NN];
int bitrev[NN];
int R[LOG + 1];
void init() {
  for (int i = 0; i < LOG + 1; i++) R[i] = rev(1 << i);
  int W = 2;
  while (true) {
    int x = W;
    for (int i = 0; i < LOG - 1; i++) x = mult(x, x);
    if (x == MOD - 1) break;
    ++W;
  }
  w[0] = 1;
  for (int i = 1; i < N; i++) {
    bitrev[i] = ((i & 1) << (LOG - 1)) ^ (bitrev[i >> 1] >> 1);
    w[i] = mult(w[i - 1], W);
  }
}
void fft(vector<int> &a, int k) {
  int L = 1 << k;
  for (int i = 0; i < L; i++) {
    int x = bitrev[i] >> (LOG - k);
    if (i > x) swap(a[i], a[x]);
  }
  for (int lvl = 0; lvl < k; ++lvl) {
    int len = 1 << lvl;
    for (int i = 0; i < L; i += len << 1) {
      for (int j = 0; j < len; j++) {
        int x = a[i + j];
        int y = mult(a[i + j + len], w[j << (LOG - 1 - lvl)]);
        a[i + j] = add(x, y);
        a[i + j + len] = sub(x, y);
      }
    }
  }
}
void invfft(vector<int> &a, int k) {
  fft(a, k);
  int L = 1 << k;
  reverse(a.begin() + 1, a.begin() + L);
  for (auto &x : a) x = mult(x, R[k]);
}
int S(int n, int m) {
  if (m > n) return 0;
  int k = 0;
  while ((1 << k) < n) ++k;
  int L = 1 << k;
  vector<vector<int> > dp(L);
  for (int i = 0; i < n; i++) dp[i] = {i, 1};
  for (int i = n; i < L; i++) dp[i] = {1};
  for (int lvl = 0; lvl < k; ++lvl) {
    int len = 1 << lvl;
    for (int i = 0; i < L; i += len << 1) {
      int sz = 1 << (lvl + 2);
      dp[i].reserve(sz);
      dp[i + len].reserve(sz);
      while ((int)dp[i].size() < sz) dp[i].push_back(0);
      while ((int)dp[i + len].size() < sz) dp[i + len].push_back(0);
      fft(dp[i], lvl + 2);
      fft(dp[i + len], lvl + 2);
      for (int j = 0; j < sz; j++) dp[i][j] = mult(dp[i][j], dp[i + len][j]);
      invfft(dp[i], lvl + 2);
      dp[i + len].clear();
    }
  };
  return dp[0][m];
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  init();
  f[0] = 1;
  for (int i = 1; i < N; i++) f[i] = mult(f[i - 1], i);
  f1[N - 1] = rev(f[N - 1]);
  for (int i = N - 1 - 1; i >= 0; i--) f1[i] = mult(f1[i + 1], i + 1);
  int n, a, b;
  cin >> n >> a >> b;
  if (a == 0 || b == 0) {
    cout << "0\n";
    return 0;
  }
  cout << mult(S(n - 1, a - 1 + b - 1), C(a - 1 + b - 1, a - 1)) << '\n';
}
