#include <bits/stdc++.h>
using namespace std;
long long int N, a, b;
const int MT = 18, T = (1 << MT) | 1;
const int K = 998244353;
int inv[T], w[T];
namespace NTT {
int power(int a, int b) {
  int t = 1;
  for (; b > 0; b >>= 1, a = 1ll * a * a % K) b & 1 ? t = 1ll * t * a % K : 0;
  return t;
}
void initNTT() {
  w[0] = 1, w[1] = power(3, K >> MT);
  for (int i = 2; i <= T - 1; i++) w[i] = 1ll * w[i - 1] * w[1] % K;
  inv[1] = 1;
  for (int i = 2; i <= T - 1; i++) inv[i] = (K - K / i) * 1ll * inv[K % i] % K;
}
int getmx(int n) {
  int mx = 1;
  for (; mx < n; mx <<= 1)
    ;
  return mx;
}
vector<int> ntt(vector<int> &a, int mx) {
  vector<int> b = a;
  static int rev[T];
  b.resize(mx);
  for (int i = 0; i <= mx - 1; i++)
    rev[i] = rev[i >> 1] >> 1 | (i & 1) * (mx >> 1),
    rev[i] > i ? swap(b[i], b[rev[i]]) : void();
  for (int k = 1, _ = T / 2; k < mx; k <<= 1, _ >>= 1)
    for (int j = 0; j < mx; j += k << 1)
      for (int t, i = j, p = 0; i < j + k; ++i, p += _)
        t = 1ll * b[i + k] * w[p] % K, b[i + k] = (b[i] - t + K) % K,
        b[i] = (b[i] + t) % K;
  return b;
}
vector<int> trans(vector<int> &a, int n) {
  const int mx = a.size();
  if (mx <= n) n = mx - 1;
  vector<int> b = a;
  vector<int> rev(mx);
  for (int i = 0; i <= mx - 1; i++)
    rev[i] = rev[i >> 1] >> 1 | (i & 1) * (mx >> 1),
    rev[i] > i ? swap(b[i], b[rev[i]]) : void();
  for (int k = 1, _ = -T / 2; k < mx; k <<= 1, _ >>= 1)
    for (int j = 0; j < mx; j += k << 1)
      for (int t, i = j, p = T - 1; i < j + k; ++i, p += _)
        t = 1ll * b[i + k] * w[p] % K, b[i + k] = (b[i] - t + K) % K,
        b[i] = (b[i] + t) % K;
  int t = power(mx, K - 2);
  vector<int> c;
  int te = 1;
  for (int i = n; i >= 0; i--)
    if (b[i]) {
      c.push_back(b[i] * 1ll * t % K);
      te = i;
      break;
    }
  for (int i = te - 1; i >= 0; i--) c.push_back(b[i] * 1ll * t % K);
  reverse(c.begin(), c.end());
  return c;
}
vector<int> inverse(vector<int> &a, int n) {
  if (n == 0) {
    vector<int> b;
    b.push_back(power(a[0], K - 2));
    return b;
  }
  vector<int> b = inverse(a, n >> 1);
  n++;
  vector<int> t;
  if (a.size() >= n)
    t = vector<int>(a.begin(), a.begin() + n);
  else
    t = a;
  int mx = getmx(n << 1);
  t = ntt(t, mx);
  b = ntt(b, mx);
  for (int i = 0; i <= mx - 1; i++)
    b[i] = b[i] * (2 * 1ll - t[i] * 1ll * b[i] % K + K) % K;
  n--;
  vector<int> C = trans(b, n);
  return trans(b, n);
}
inline vector<int> derivative(vector<int> &a, int m) {
  vector<int> b;
  for (int i = 0; i + 1 < a.size(); i++) {
    b.push_back(a[i + 1] * 1ll * (i + 1) % K);
  }
  return b;
}
inline vector<int> integrate(vector<int> &a, int m) {
  vector<int> b;
  b.push_back(0);
  for (long long int i = 1; i - 1 < a.size() && i <= m; i++) {
    b.push_back(a[i - 1] * 1ll * inv[i] % K);
  }
  return b;
}
vector<int> ln(vector<int> &a, int n) {
  int mx = getmx((n + 1) << 1);
  vector<int> u = derivative(a, n);
  u = ntt(u, mx);
  vector<int> d = inverse(a, n);
  d = ntt(d, mx);
  vector<int> b(mx);
  for (int i = 0; i <= mx - 1; i++) b[i] = u[i] * 1ll * d[i] % K;
  b = trans(b, n);
  return integrate(b, n);
}
vector<int> exp(vector<int> &a, int n) {
  if (!n) {
    vector<int> b;
    b.push_back(1);
    return b;
  }
  vector<int> b = exp(a, n >> 1);
  n++;
  vector<int> l, t;
  int mx = getmx(n << 1);
  if (a.size() >= n)
    t = vector<int>(a.begin(), a.begin() + n);
  else
    t = a;
  t = ntt(t, mx);
  l = ln(b, n - 1);
  l = ntt(l, mx);
  b = ntt(b, mx);
  for (int i = 0; i <= mx - 1; i++)
    b[i] = b[i] * 1ll * (1ll - l[i] + t[i] + K) % K;
  n--;
  return trans(b, n);
}
vector<int> pw(vector<int> &a, int n, int m) {
  vector<int> res;
  if (n == 0) {
    res.push_back(1);
    return res;
  }
  int A0 = power(a[0], n);
  res = ln(a, m);
  for (int i = 0; i < res.size(); i++) res[i] = res[i] * 1ll * n % K;
  res = exp(res, m);
  for (int i = 0; i < res.size(); i++) res[i] = res[i] * 1ll * A0 % K;
  return res;
}
}  // namespace NTT
using namespace NTT;
vector<int> A, B, C;
int c[100005], d[100005], gt[100005], rev[100005];
void calc_Sterling1(int k, int c[100005]) {
  B = pw(A, k, N);
  for (int i = 0; i <= k - 1; i++) c[i] = 0;
  for (int i = k; i < B.size() && i <= N; i++) {
    c[i] = B[i - k] * 1ll * gt[i] % K * 1ll * rev[k] % K;
  }
}
int Combi(int n, int k) {
  if (k > n) return 0;
  return gt[n] * 1ll * rev[k] % K * rev[n - k] % K;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  initNTT();
  rev[0] = gt[0] = 1;
  cin >> N >> a >> b;
  if (!a || !b) {
    cout << 0;
    return 0;
  }
  for (int i = 1; i <= N + 2; i++) {
    gt[i] = gt[i - 1] * 1ll * i % K;
    rev[i] = power(gt[i], K - 2);
  }
  for (int i = 1; i <= N; i++) {
    A.push_back(inv[i]);
  }
  calc_Sterling1(a - 1, c);
  calc_Sterling1(b - 1, d);
  int res = 0;
  for (int i = 0; i <= N - 1; i++) {
    res = (res + c[i] * 1ll * d[N - 1 - i] % K * Combi(N - 1, i) % K) % K;
  }
  res = (res + K) % K;
  cout << res << endl;
  return 0;
}
