#include <bits/stdc++.h>
namespace my_std {
using namespace std;
template <typename T>
inline void read(T &t) {
  t = 0;
  char f = 0, ch = getchar();
  double d = 0.1;
  while (ch > '9' || ch < '0') f |= (ch == '-'), ch = getchar();
  while (ch <= '9' && ch >= '0') t = t * 10 + ch - 48, ch = getchar();
  if (ch == '.') {
    ch = getchar();
    while (ch <= '9' && ch >= '0') t += d * (ch ^ 48), d *= 0.1, ch = getchar();
  }
  t = (f ? -t : t);
}
template <typename T, typename... Args>
inline void read(T &t, Args &...args) {
  read(t);
  read(args...);
}
void file() {}
inline long long mul(long long a, long long b) {
  long long d = (long long)(a * (double)b / 998244353 + 0.5);
  long long ret = a * b - d * 998244353;
  if (ret < 0) ret += 998244353;
  return ret;
}
}  // namespace my_std
using namespace my_std;
long long fac[500500], _fac[500500];
long long ksm(long long x, long long y) {
  long long ret;
  for (ret = 1; y; y >>= 1, x = x * x % 998244353)
    if (y & 1) ret = ret * x % 998244353;
  return ret;
}
long long inv(long long x) { return ksm(x, 998244353 - 2); }
void init() {
  fac[0] = _fac[0] = 1;
  for (long long i = (1); i <= (500500 - 5); i++)
    _fac[i] = inv(fac[i] = fac[i - 1] * i % 998244353);
}
const long long g = 3;
long long r[500500], limit;
void NTT(long long *a, long long type) {
  for (long long i = (0); i <= (limit - 1); i++)
    if (r[i] < i) swap(a[i], a[r[i]]);
  for (long long mid = 1; mid < limit; mid <<= 1) {
    long long Wn = ksm(g, (998244353 - 1) / mid >> 1);
    if (type == -1) Wn = inv(Wn);
    for (long long len = mid << 1, j = 0; j < limit; j += len) {
      long long w = 1;
      for (long long k = 0; k < mid; k++, w = 1ll * w * Wn % 998244353) {
        long long x = a[j + k], y = 1ll * w * a[mid + j + k];
        a[j + k] = (x + y + 998244353) % 998244353;
        a[j + k + mid] = (x - y + 998244353) % 998244353;
      }
    }
  }
  if (type == -1) {
    long long t = inv(limit);
    for (long long i = (0); i <= (limit - 1); i++)
      a[i] = (1ll * a[i] * t % 998244353 + 998244353) % 998244353;
  }
}
void NTT(long long *a, long long *b, long long len) {
  limit = 1;
  long long l = -1;
  while (limit <= len * 2) limit <<= 1, ++l;
  for (long long i = (1); i <= (limit - 1); i++)
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << l);
  for (long long i = (len); i <= (limit); i++) a[i] = b[i] = 0;
  NTT(a, 1);
  NTT(b, 1);
  for (long long i = (0); i <= (limit); i++)
    a[i] = 1ll * a[i] * b[i] % 998244353;
  NTT(a, -1);
}
long long X[500500], a[500500], b[500500];
void work(long long len) {
  if (len == 1) return (void)(X[1] = 1);
  if (len & 1) {
    work(len - 1);
    X[len] = 0;
    for (long long i = (len); i >= (1); i--)
      (X[i] = X[i - 1] + 1ll * X[i] * (len - 1) % 998244353) %= 998244353;
    return;
  }
  long long n = len >> 1;
  work(n);
  for (long long i = n, w = 1; i >= 0; i--, w = 1ll * w * n % 998244353)
    a[i] = 1ll * w * _fac[n - i] % 998244353;
  for (long long i = (0); i <= (n); i++) b[i] = fac[i] * X[i] % 998244353;
  for (long long i = (n + 1); i <= (n << 2); i++) a[i] = b[i] = 0;
  NTT(a, b, n + 1);
  for (long long i = (0); i <= (n); i++)
    a[i] = 1ll * a[i + n] * _fac[i] % 998244353;
  for (long long i = (n + 1); i <= (limit); i++) a[i] = 0;
  NTT(X, a, n + 1);
}
long long n, A, B;
signed main() {
  file();
  init();
  read(n, A, B);
  if (n == 1) return puts(A == B && A == 1 ? "1" : "0"), 0;
  work(n - 1);
  cout << 1ll * X[A + B - 2] * fac[A + B - 2] % 998244353 * _fac[A - 1] %
              998244353 * _fac[B - 1] % 998244353;
}
