#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N = 1 << 18, mod = 7 * 17 * (1 << 23) + 1, g = 3;
const int M = N >> 1;
int inv_n;
vector<int> rev, w;
inline int Pow(int a, int p) {
  int ret = 1;
  while (p) {
    if (p & 1) ret = (long long)ret * a % mod;
    a = (long long)a * a % mod;
    p >>= 1;
  }
  return ret;
}
inline int mul(int a, int b) { return (long long)a * b % mod; }
void prepare(int n) {
  int sz = __builtin_ctz(n);
  if (rev.size() != n) {
    rev.assign(n, 0);
    for (int i = 0; i < n; ++i) {
      rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (sz - 1));
    }
    inv_n = Pow(n, mod - 2);
  }
  if (w.size() >= n) return;
  if (w.empty()) w = {0, 1};
  sz = __builtin_ctz(w.size());
  w.resize(n);
  while ((1 << sz) < n) {
    int wn = Pow(g, (mod - 1) >> (sz + 1));
    for (int i = 1 << (sz - 1); i < (1 << sz); ++i) {
      w[i << 1] = w[i];
      w[i << 1 | 1] = mul(w[i], wn);
    }
    ++sz;
  }
}
void ntt(int *p, int n, int inv = 0) {
  prepare(n);
  if (inv) reverse(p + 1, p + n);
  for (int i = 1; i < n - 1; ++i)
    if (i < rev[i]) swap(p[i], p[rev[i]]);
  for (int h = 1; h < n; h <<= 1) {
    for (int s = 0; s < n; s += h << 1) {
      for (int i = 0; i < h; ++i) {
        int &u = p[s + i], &v = p[s + h + i], t = mul(v, w[h + i]);
        v = u - t;
        u = u + t;
        if (v < 0) v += mod;
        if (u >= mod) u -= mod;
      }
    }
  }
  if (inv)
    for (int i = 0; i < n; ++i) p[i] = mul(p[i], inv_n);
}
int f[M], h[M], a[M], b[M];
int fact[M], inv[M];
void build(int n) {
  if (n == 1) return void(f[0] = f[1] = 1);
  if (n & 1) {
    build(n - 1);
    for (int i = n; i >= 1; i--) {
      f[i] = f[i - 1] + (long long)n * f[i] % mod;
      if (f[i] >= mod) f[i] -= mod;
    }
    f[0] = (long long)f[0] * n % mod;
    return;
  }
  n >>= 1;
  build(n);
  int t = n + n + 1, sz = 1;
  while (sz < t) sz <<= 1;
  prepare(sz);
  for (int i = 0; i <= n; i++) a[i] = (long long)f[n - i] * fact[n - i] % mod;
  for (int i = 0, p = 1; i <= n; i++) {
    b[i] = (long long)p * inv[i] % mod;
    p = (long long)p * n % mod;
  }
  for (int i = n + 1; i < sz; i++) a[i] = b[i] = 0;
  ntt(a, sz);
  ntt(b, sz);
  for (int i = 0; i < sz; i++) h[i] = (long long)a[i] * b[i] % mod;
  ntt(h, sz, 1);
  reverse(h, h + n + 1);
  for (int i = 0; i <= n; i++) h[i] = (long long)h[i] * inv[i] % mod;
  for (int i = n + 1; i < sz; i++) f[i] = h[i] = 0;
  ntt(h, sz);
  ntt(f, sz);
  for (int i = 0; i < sz; i++) f[i] = (long long)f[i] * h[i] % mod;
  ntt(f, sz, 1);
}
void precalc() {
  fact[0] = 1;
  for (int i = 1; i < M; i++) fact[i] = (long long)fact[i - 1] * i % mod;
  inv[M - 1] = Pow(fact[M - 1], mod - 2);
  for (int i = M - 2; i >= 0; i--)
    inv[i] = (long long)inv[i + 1] * (i + 1) % mod;
}
int C(int n, int r) {
  int ret = (long long)fact[n] * inv[r] % mod;
  return (long long)ret * inv[n - r] % mod;
}
int S(int n, int k) {
  if (k > n) return 0;
  if (k == 0) return n == 0;
  if (n <= 1) return n == k;
  build(n - 1);
  return f[k - 1];
}
int main(int argc, char const *argv[]) {
  precalc();
  int n, a, b;
  scanf("%d %d %d", &n, &a, &b);
  if (a + b < 2)
    puts("0");
  else {
    int ans = C(a + b - 2, a - 1);
    ans = (long long)ans * S(n - 1, a + b - 2) % mod;
    printf("%d\n", ans);
  }
}
