func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long max(long long a, long long b) { return a > b ? a : b; }   inline long long min(long long a, long long b) { return a > b ? b : a; }   template <typename T>   inline int read(T& res) {     long long x = 0, f = 1, flag = 0;     char ch;     flag = ch = getchar();     if (flag == -1) return -1;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       flag = ch = getchar();       if (flag == -1) return -1;     }     while (ch >=  0  && ch <=  9  && flag != -1) {       x = (x << 1) + (x << 3) + (ch ^ 48);       flag = ch = getchar();     }     res = x * f;     return flag;   }   template <typename T, typename... Args>   inline int read(T& t, Args&... a) {     int res;     res = read(t);     if (res == -1) return -1;     res = read(a...);     return res;   }   const int maxn = 5511, mod = 1e9 + 9;   long long n, m, k;   long long qpow(long long x, long long y) {     long long ans = 1;     while (y) {       if (y & 1) ans = (ans * x) % mod;       y >>= 1;       x = (x * x) % mod;     }     return ans % mod;   }   long long A1, A2, C1[maxn], C2[maxn], w, b;   inline void solve() {     long long ans = 0, mx = max(w, b);     A1 = A2 = 1;     for (int i = 2; i <= w; i++) A1 = (A1 * i) % mod;     for (int i = 2; i <= b; i++) A2 = (A2 * i) % mod;     C1[2] = w - 1;     C2[2] = b - 1;     C1[1] = C2[1] = 1;     for (int i = 3; i <= mx; i++) {       long long inv = qpow(i - 1, mod - 2);       C1[i] = (C1[i - 1] * (w - i + 1) % mod * inv) % mod,       C2[i] = (C2[i - 1] * (b - i + 1) % mod * inv) % mod;     }     int lim = max(1, n - w);     for (int x = min(n - 2, b); x >= lim; x--) {       ans = (ans + (((((n - x - 1) * A1 % mod) * C1[n - x] % mod) * A2) % mod) *                        C2[x]) %             mod;     }     cout << ans << endl;   }   int main() {     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);     int t = 1;     while (cin >> n >> w >> b) solve();   }   