func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mo = 998244353;   const long long g = 3;   const int N = 500000;   int n, ax, bx, rev[N + 10];   long long aa[N + 10], bb[N + 10], c[N + 10], fac[N + 10], inv[N + 10];   long long mul(long long x, long long y) {     long long z = 1;     while (y) {       if (y & 1) z = z * x % mo;       y >>= 1;       x = x * x % mo;     }     return z;   }   struct poly {     vector<int> a;     void pre(int n) {       rev[0] = 0;       for (int i = 1; i < n; i++)         if (i & 1)           rev[i] = rev[i ^ 1] + (n >> 1);         else           rev[i] = rev[i >> 1] >> 1;     }     void FFT(long long *a, int n) {       for (int i = 0; i < n; i++) c[rev[i]] = a[i];       for (int i = 2; i <= n; i <<= 1) {         long long wn = mul(g, (mo - 1) / i);         for (int j = 0; j < n; j += i) {           long long w = 1;           for (int k = j; k < j + i / 2; k++, w = wn * w % mo) {             long long ck = c[k];             c[k] = (ck + w * c[k + i / 2]) % mo;             c[k + i / 2] = (ck - w * c[k + i / 2]) % mo;           }         }       }       for (int i = 0; i < n; i++) a[i] = (c[i] + mo) % mo;     }     void IFFT(long long *a, int n) {       FFT(a, n);       for (int i = 1; i < n / 2; i++) swap(a[i], a[n - i]);       long long invn = mul(n, mo - 2);       for (int i = 0; i < n; i++) a[i] = a[i] * invn % mo;     }     poly operator*(poly &p) {       int sz = a.size() + p.a.size() - 1;       int nx = 1;       while (nx < sz) nx <<= 1;       pre(nx);       for (int i = 0; i < nx; i++) {         if (i < (int)a.size())           aa[i] = a[i];         else           aa[i] = 0;         if (i < (int)p.a.size())           bb[i] = p.a[i];         else           bb[i] = 0;       }       FFT(aa, nx);       FFT(bb, nx);       for (int i = 0; i < nx; i++) aa[i] = aa[i] * bb[i] % mo;       IFFT(aa, nx);       poly ans;       ans.a.clear();       for (int i = 0; i < sz; i++) ans.a.push_back(aa[i]);       return ans;     }   };   void prework() {     fac[0] = 1;     for (int i = 1; i <= N; i++) fac[i] = fac[i - 1] * i % mo;     inv[N] = mul(fac[N], mo - 2);     for (int i = N - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mo;   }   poly Calc_Stirling(int l, int r) {     poly f;     f.a.clear();     if (l > r) {       f.a.push_back(1);       return f;     }     if (l == r) {       f.a.push_back(l);       f.a.push_back(1);       return f;     }     int mid = (l + r) / 2;     f = Calc_Stirling(l, mid);     poly g = Calc_Stirling(mid + 1, r);     f = f * g;     return f;   }   int main() {     scanf( %d%d%d , &n, &ax, &bx);     if (ax == 0 || bx == 0) {       printf( 0 n );       return 0;     }     prework();     poly f = Calc_Stirling(0, n - 2);     long long ans;     if (ax + bx - 2 < (int)f.a.size())       ans = f.a[ax + bx - 2];     else       ans = 0;     ans =         (ans * fac[ax + bx - 2] % mo * inv[ax - 1] % mo * inv[bx - 1] % mo + mo) %         mo;     printf( %lld n , ans);     return 0;   }   