func_code_string: #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;   }   