func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T, size_t... Is>   struct arr_helper;   template <class T, size_t... Is>   using arr = typename arr_helper<T, Is...>::type;   template <class T>   struct arr_helper<T> {     using type = T;   };   template <class T, size_t I, size_t... Is>   struct arr_helper<T, I, Is...> {     using type = array<arr<T, Is...>, I>;   };   using ll = long long;   using u64 = uint64_t;   using u32 = uint32_t;   using vi = vector<int>;   using vl = vector<ll>;   using vvi = vector<vi>;   using pi = pair<int, int>;   using pl = pair<ll, ll>;   using vpi = vector<pi>;   [[maybe_unused]] const int INF = (int)1e9;   [[maybe_unused]] const ll INFL = (ll)1e18;   ll M = 998244353;   int mod_pow(ll b, ll e) {     ll res = 1;     for (; e; b = b * b % M, e /= 2)       if (e % 2) res = res * b % M;     return (int)res;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(nullptr);     int n, m, k;     cin >> n >> m >> k;     vi f(k + 1), fi(k + 1), fn(k + 1);     f[0] = 1;     for (int i = (1); i < (k + 1); ++i) f[i] = (ll)f[i - 1] * i % M;     for (int i = 0; i < (k + 1); ++i) fi[i] = mod_pow(f[i], M - 2);     fn[0] = 1;     for (int i = (1); i < (k + 1); ++i) fn[i] = fn[i - 1] * (ll)(n - i + 1) % M;     auto choose = [&](int n, int k) {       if (k > n) return 0ll;       return (ll)f[n] * fi[n - k] % M * (ll)fi[k] % M;     };     auto choose_n = [&](int k) { return fn[k] * (ll)fi[k] % M; };     ll sum = 0;     auto p = mod_pow(m, M - 2);     auto q = (ll)(m - 1) * p % M;     vi nmkitok(k + 1);     for (int i = 0; i < (k + 1); ++i) nmkitok[i] = mod_pow(n - i, k);     for (int j = 0; j < (k + 1); ++j) {       ll si = 0;       for (int ki = 0; ki < (j + 1); ++ki) {         si += (ll)(ki % 2 ? M - 1 : 1) * choose(j, ki) % M * nmkitok[ki] % M;         si %= M;       }       sum += mod_pow(M - q, j) * (ll)choose_n(j) % M * si % M;       sum %= M;     }     cout << sum <<   n ;     return 0;   }   