#include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   using namespace std;   inline int read() {     char c = getchar();     int x = 0, f = 1;     while ((c <  0  || c >  9 ) && c -  - ) c = getchar();     if (c ==  - ) f = -1, c = getchar();     while (c >=  0  && c <=  9 ) {       x = (x << 3) + (x << 1) + c - 48;       c = getchar();     }     return x * f;   }   const int N = 3e5 + 10;   int n, rev[N];   long long f[N], g[N], jc[N], inv[N], z[N];   const long long mo = 998244353, Gi = 3;   inline long long qp(long long a, long long b) {     long long ans = 1;     while (b) {       if (b & 1) ans = (ans * a) % mo;       a = (a * a) % mo;       b >>= 1;     }     return ans;   }   int lim = 1, l = 0;   inline void ntt(long long a[], int pan) {     for (int i = 0; i < lim; i++)       if (i > rev[i]) swap(a[i], a[rev[i]]);     for (int bj = 1; bj < lim; bj <<= 1) {       long long wn = qp(Gi, (mo - 1) / (bj << 1));       if (pan) wn = qp(wn, mo - 2);       for (int ks = 0; ks < lim; ks += (bj << 1)) {         long long w = 1;         for (int i = 0; i < bj; i++, w = (w * wn) % mo) {           long long x = a[ks + i], y = w * a[ks + i + bj] % mo;           a[ks + i] = (x + y) % mo;           a[ks + i + bj] = ((x - y) % mo + mo) % mo;         }       }     }     if (pan) {       long long ni = qp(lim, mo - 2);       for (int i = 0; i < lim; i++) a[i] = (a[i] * ni) % mo;     }   }   void gao(int t) {     if (t == 1) {       f[1] = 1;       return;     }     int mi = t / 2;     gao(mi);     for (int i = 0; i <= mi; i++) z[i] = f[i], f[i] = f[i] * jc[i] % mo;     long long c = mi, gu = 1;     g[mi] = inv[0];     for (int i = mi - 1; i >= 0; i--) {       gu = (gu * c) % mo;       g[i] = gu * inv[mi - i] % mo;     }     lim = 1, l = 0;     while (lim <= (mi << 1)) lim <<= 1, l++;     for (int i = 0; i < lim; i++)       rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);     ntt(f, 0);     ntt(g, 0);     for (int i = 0; i < lim; i++) f[i] = (f[i] * g[i]) % mo, g[i] = 0;     ntt(f, 1);     long long ji = f[mi];     for (int i = mi; i >= 1; i--) {       f[i] = f[i + mi];       f[i + mi] = 0;     }     f[0] = ji;     for (int i = 0; i <= mi; i++) f[i] = (f[i] * inv[i]) % mo;     lim = 1, l = 0;     while (lim <= (mi << 1)) lim <<= 1, l++;     for (int i = 0; i < lim; i++)       rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << l - 1);     ntt(z, 0);     ntt(f, 0);     for (int i = 0; i < lim; i++) z[i] = (z[i] * f[i]) % mo;     ntt(z, 1);     for (int i = 0; i < lim; i++) f[i] = z[i], z[i] = 0;     if (t % 2) {       z[0] = (f[0] * (t - 1)) % mo;       for (int i = 1; i <= (mi << 1) + 1; i++)         z[i] = (f[i - 1] + (f[i] * (t - 1))) % mo;       for (int i = 1; i <= (mi << 1) + 1; i++) f[i] = z[i], z[i] = 0;     }   }   int A, B;   int main() {     jc[0] = inv[0] = 1;     for (int i = 1; i <= N - 10; i++) jc[i] = (jc[i - 1] * i) % mo;     inv[N - 10] = qp(jc[N - 10], mo - 2);     for (int i = N - 11; i >= 1; i--) inv[i] = (inv[i + 1] * (i + 1)) % mo;     n = read();     A = read();     B = read();     if (n == 1) {       if (A + B == 2)         cout <<  1 n ;       else         cout <<  0 n ;       return 0;     }     if (!A || !B || A + B > n + 1) {       cout <<  0 n ;       return 0;     }     gao(n - 1);     cout << f[A + B - 2] * jc[A + B - 2] % mo * inv[A - 1] % mo * inv[B - 1] % mo          <<   n ;     return 0;   }