func_code_string: #include <bits/stdc++.h>   using namespace std;   inline void read(register int *n) {     register char c;     *n = 0;     do {       c = getchar();     } while (c <  0  || c >  9 );     do {       *n = c -  0  + *n * 10;       c = getchar();     } while (c >=  0  && c <=  9 );   }   long long C[2048][2048], fac[1000001], dfac[1000001], D[2048][2048];   long long pmod(long long x, long long y) {     if (y == 0) return 1;     if (y % 2) return pmod(x, y - 1) * x % 1000000007;     long long r = pmod(x, y / 2);     return r * r % 1000000007;   }   long long calc(long long n, long long k, long long c = 0) {     long long res = 0;     for (register int i = (0); i < (int)(k + 1); ++i) {       long long tmp = C[k][i] * pmod(i + c, n);       tmp %= 1000000007;       if (i % 2)         res -= tmp;       else         res += tmp;       res %= 1000000007;     }     return res;   }   inline long long binom(long long n, long long r) {     if (r < 0 || r > n) return 0;     long long res = 1;     res = res * fac[n] % 1000000007;     res = res * dfac[r] % 1000000007;     res = res * dfac[n - r] % 1000000007;     return res;   }   int main() {     for (register int i = (0); i < (int)(1000001); ++i)       fac[i] = (i ? fac[i - 1] * i : 1) % 1000000007,       dfac[i] = pmod(fac[i], 1000000007 - 2);     for (register int i = (0); i < (int)(2048); ++i)       for (register int j = (0); j < (int)(i + 1); ++j)         C[i][j] = (j == 0 || j == i) ? 1 : (C[i - 1][j - 1] + C[i - 1][j]);     for (register int i = (0); i < (int)(2048); ++i)       for (register int j = (0); j < (int)(2048); ++j)         if (i == 0)           D[i][j] = j == 0;         else if (j <= 1)           D[i][j] = j;         else           D[i][j] = (j * D[i - 1][j] + D[i - 1][j - 1]) % 1000000007;     int n, m, k;     cin >> n >> m >> k;     if (m == 1) {       cout << pmod(k, n) << endl;       return 0;     }     long long res = 0;     for (register int x = (1); x < (int)(min(k, n) + 1); ++x)       for (int y = 0; y <= x; y++)         if (x * 2 - y <= k) {           long long tmp = binom(k, x * 2 - y);           tmp = tmp * binom(x * 2 - y, x - y) % 1000000007;           tmp = tmp * binom(x, x - y) % 1000000007;           tmp = tmp * D[n][x] % 1000000007;           tmp = tmp * D[n][x] % 1000000007;           tmp = tmp * fac[x] % 1000000007;           tmp = tmp * fac[x] % 1000000007;           tmp = tmp * pmod(y, n * (m - 2));           res = (res + tmp) % 1000000007;         }     cout << res << endl;     return 0;   }   