func_code_string: #include <bits/stdc++.h>   using namespace std;   const int iinf = 1e9 + 10;   const long long inf = 1ll << 60;   const long long mod = 1e9 + 7;   void GG() {     cout <<  0 n ;     exit(0);   }   long long mpow(long long a, long long n, long long mo = mod) {     long long re = 1;     while (n > 0) {       if (n & 1) re = re * a % mo;       a = a * a % mo;       n >>= 1;     }     return re;   }   long long inv(long long b, long long mo = mod) {     if (b == 1) return b;     return (mo - mo / b) * inv(mo % b, mo) % mo;   }   const int maxn = 1e6 + 5;   long long dp[2003][22];   long long fac[200006], ifac[200006];   inline long long CC(int a, int b) {     a = a + b;     return fac[a] * ifac[b] % mod * ifac[a - b] % mod;   }   int R[2003], C[2003];   signed main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     ;     fac[0] = ifac[0] = 1;     for (int i = 1; i <= 200006; ++i) {       fac[i] = fac[i - 1] * i % mod;       ifac[i] = inv(fac[i]);     }     int n, m, k, second;     cin >> n >> m >> k >> second;     vector<pair<int, int> > v;     v.push_back({1, 1});     v.push_back({n, m});     for (int i = 0; i < k; ++i) {       int r, c;       cin >> r >> c;       v.push_back({r, c});     }     sort(v.begin(), v.end());     for (int i = 1; i <= (int)v.size() - 1; ++i) {       R[i] = v[i].first, C[i] = v[i].second;       dp[i][0] = CC(R[i] - 1, C[i] - 1);       for (int fk = 0; fk < 21; ++fk) {         for (int j = 1; j <= i - 1; ++j) {           if (R[j] <= R[i] && C[j] <= C[i]) {             dp[i][fk] -= dp[j][fk] * CC(R[i] - R[j], C[i] - C[j]) % mod;             if (dp[i][fk] < 0) dp[i][fk] += mod;             dp[i][fk + 1] += dp[j][fk] * CC(R[i] - R[j], C[i] - C[j]) % mod;             if (dp[i][fk + 1] >= mod) dp[i][fk + 1] -= mod;           }         }       }     }     long long re = 0;     for (int fk = 0; fk < 22; ++fk) {       re += dp[(int)v.size() - 1][fk] * second % mod;       second = (second + 1) / 2;     }     cout << re * inv(CC(n - 1, m - 1)) % mod <<   n ;   }   