func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1510;   const int MOD = 1000000007;   const int SZ = 100010;   inline int add(int u, int v) { return (u += v) >= MOD ? u - MOD : u; }   inline int sub(int u, int v) { return (u -= v) < 0 ? u + MOD : u; }   inline int mul(int u, int v) { return (long long)u * v % MOD; }   inline int power(int u, int v) {     int res = 1;     while (v) {       if (v & 1) res = mul(res, u);       u = mul(u, u);       v >>= 1;     }     return res;   }   inline int inv(int u) { return power(u, MOD - 2); }   int n, m, a, b, k, p;   int dp[N][N];   int pref[N][N];   int sumG[N], g[N];   int fac[SZ], invFac[SZ];   int comb(int n, int k) {     if (k > n || k < 0) return 0;     return mul(fac[n], mul(invFac[k], invFac[n - k]));   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n >> m;     cin >> a >> b;     cin >> k;     p = mul(a, inv(b));     fac[0] = 1;     for (int i = 1; i < SZ; i++) {       fac[i] = mul(fac[i - 1], i);     }     invFac[SZ - 1] = inv(fac[SZ - 1]);     for (int i = SZ - 2; i >= 0; i--) {       invFac[i] = mul(invFac[i + 1], i + 1);     }     for (int i = 0; i <= m; i++) {       g[i] = comb(k, i);       if (g[i] != 0) {         g[i] = mul(g[i], power(p, i));         g[i] = mul(g[i], power(sub(1, p), k - i));       }       sumG[i] = g[i];       if (i > 0) sumG[i] = add(sumG[i], sumG[i - 1]);     }     memset(dp, 0, sizeof dp);     memset(pref, 0, sizeof pref);     dp[0][m] = 1;     for (int i = 1; i <= n; i++) {       for (int r = 1; r <= m; r++) {         int p1 = mul(sumG[r - 1], sub(dp[i - 1][m], dp[i - 1][m - r]));         int p2 = pref[i - 1][r - 1];         int foo = mul(sub(p1, p2), g[m - r]);         dp[i][r] = add(dp[i][r - 1], foo);         pref[i][r] = add(pref[i][r - 1], mul(g[r], dp[i][r]));       }     }     cout << dp[n][m] << endl;     return 0;   }   