func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 998244353, maxn = 1e6, MAXN = 1 << 21;   int jc[2222222], injc[2222222], n, a, b, s[2222222], t[2222222], l, r,       pw[2222222], sz, rev[2222222], cnt;   int S[2222222], T[2222222], G[2222222], w[2][2222222], cur, gg[2222222];   long long c[2222222];   int binpow(int a, int t) {     int res = 1, p = a;     for (int i = t; i; i >>= 1) {       if (i & 1) res = (long long)res * p % mod;       p = (long long)p * p % mod;     }     return res;   }   int C(int n, int k) {     if (n < k) return 0;     return ((long long)jc[n] * injc[k] % mod) * injc[n - k] % mod;   }   void Init() {     jc[0] = injc[0] = 1;     for (int i = 1; i <= maxn; i++) {       jc[i] = (long long)jc[i - 1] * i % mod;     }     injc[maxn] = binpow(jc[maxn], mod - 2);     for (int i = maxn - 1; i >= 0; i--)       injc[i] = (long long)injc[i + 1] * (i + 1) % mod;     w[0][0] = 1;     cur = binpow(3, (mod - 1) / MAXN);     for (int i = 1; i <= MAXN; i++) w[0][i] = (long long)w[0][i - 1] * cur % mod;     w[1][0] = 1;     cur = binpow(3, mod - 1 - (mod - 1) / MAXN);     for (int i = 1; i <= MAXN; i++) w[1][i] = (long long)w[1][i - 1] * cur % mod;   }   void ntt(int d[], int flag) {     for (int i = 0; i < sz; i++) c[i] = (long long)d[i];     for (int i = 0; i < sz; i++) {       if (rev[i] > i) swap(c[i], c[rev[i]]);     }     for (int i = 2; i <= sz; i <<= 1) {       int p = i >> 1, fu = MAXN / i;       for (int j = 0; j < p; j++) {         gg[j] = w[flag][j * fu];       }       for (int j = 0; j < sz; j += i) {         for (int k = j; k < j + p; k++) {           long long tmp1 = c[k];           long long tmp2 = c[k + p] % mod * gg[k - j];           c[k] = tmp1 + tmp2;           c[k + p] = tmp1 - tmp2;         }       }     }     for (int j = 0; j < sz; j++) c[j] %= mod;     if (flag) {       int wn = binpow(sz, mod - 2);       for (int i = 0; i < sz; i++) {         c[i] = c[i] * wn % mod;       }     }     for (int i = 0; i < sz; i++) d[i] = c[i];   }   void doit() {     if (sz <= 64) {       for (int i = 0; i < sz; i++) G[i] = 0;       for (int i = 0; i < sz; i++) {         for (int j = 0; j < sz - i; j++) {           G[i + j] = ((long long)S[i] * T[j] + G[i + j]) % mod;         }       }       for (int i = 0; i < sz; i++) S[i] = G[i];       return;     }     rev[0] = 0;     for (int i = 1; i < sz; i++) {       rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (cnt - 1));     }     ntt(S, 0);     ntt(T, 0);     for (int i = 0; i < sz; i++) S[i] = (long long)S[i] * T[i] % mod;     ntt(S, 1);   }   void solve(int n) {     if (n == 1) {       s[1] = 1;       return;     }     if (!n) {       s[0] = 1;       return;     }     if (n & 1) {       solve(n - 1);       t[0] = (long long)s[0] * (n - 1) % mod;       for (int i = 1; i <= n; i++)         t[i] = ((long long)s[i] * (n - 1) + s[i - 1]) % mod;       for (int i = 1; i <= n; i++) s[i] = t[i];     } else {       solve(n >> 1);       pw[0] = 1;       sz = 1;       cnt = 0;       while (sz <= n) {         sz *= 2;         cnt++;       }       int c = (n >> 1);       for (int i = 1; i <= c; i++) pw[i] = (long long)pw[i - 1] * c % mod;       for (int i = 0; i < sz; i++) S[i] = T[i] = 0;       for (int i = 0; i <= c; i++) S[i] = (long long)s[i] * jc[i] % mod;       for (int i = 0; i <= c; i++) T[i] = (long long)pw[i] * injc[i] % mod;       reverse(T, T + c + 1);       doit();       for (int j = 0; j < sz; j++) T[j] = 0;       for (int j = c; j <= n; j++) T[j - c] = (long long)S[j] * injc[j - c] % mod;       for (int j = 0; j < sz; j++) S[j] = s[j];       doit();       for (int j = 0; j <= n; j++) s[j] = S[j];     }   }   int main() {     cin >> n >> a >> b;     Init();     n--;     if (!n) {       if (!(a + b - 2))         cout << C(a + b - 2, a - 1) << endl;       else         cout << 0 << endl;       return 0;     }     solve(n);     cout << ((long long)s[a + b - 2] * C(a + b - 2, a - 1) % mod + mod) % mod          << endl;     return 0;   }   