func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e6 + 10, P = 1e9 + 7;   int qpow(int a, int n) {     int ans = 1;     for (; n; a = a * (int64_t)a % P, n >>= 1)       if (n & 1) ans = ans * (int64_t)a % P;     return ans;   }   int fac[N], ifac[N], f[N];   int C(int n, int m) {     if (m > n) return 0;     return fac[n] * (int64_t)ifac[m] % P * ifac[n - m] % P;   }   int main() {     fac[0] = 1;     for (int i = 1; i < N; ++i) fac[i] = fac[i - 1] * (int64_t)i % P;     ifac[N - 1] = qpow(fac[N - 1], P - 2);     for (int i = N - 2; i >= 0; --i) ifac[i] = ifac[i + 1] * (i + 1ll) % P;     int n, m, k;     cin >> n >> m >> k;     if (m == 1) return cout << qpow(k, n) << endl, 0;     for (int i = 1; i <= min(n, k); ++i) {       for (int j = i; j >= 0; --j) {         int ret = (int64_t)C(i, j) * qpow(j, n) % P;         if (j % 2 == i % 2)           f[i] = (f[i] + ret) % P;         else           f[i] = (f[i] - ret) % P;       }     }     int ans = 0;     if (m == 2) {       for (int i = 1; i <= n; ++i) {         ans = (ans + C(k, i) * (int64_t)C(k, i) % P * f[i] % P * f[i]) % P;       }     } else {       for (int i = 1; i <= min(n, k); ++i) {         for (int j = 1; j <= i; ++j) {           ans = (ans + C(k, i) * (int64_t)C(i, j) % P * C(k - i, i - j) % P *                            f[i] % P * f[i] % P * qpow(j, n * (m - 2))) %                 P;         }       }     }     if (ans < 0) ans += P;     cout << ans << endl;   }   