func_code_string: #include <bits/stdc++.h>   using namespace std;   const int LN = 18, maxn = (1 << LN);   const long long mod = (long long)(998244353);   int fact[maxn], inv_fact[maxn], poww_r[maxn], poww_inv_r[maxn];   int mul(long long a, long long b) {     long long ret = (a * b) % mod;     return (int)(ret);   }   int add(int a, int b) {     int ret = a + b;     if (ret >= mod) {       ret -= mod;     }     return ret;   }   int poww(int a, int b) {     int x = 1, y = a;     while (b > 0) {       if (b % 2 == 1) {         x = mul(x, y);       }       y = mul(y, y);       b /= 2;     }     return x;   }   void build() {     fact[0] = 1;     for (int i = 1; i < maxn; i++) {       fact[i] = mul(fact[i - 1], i);     }     inv_fact[maxn - 1] = poww(fact[maxn - 1], mod - 2);     for (int i = maxn - 2; i >= 0; i--) {       inv_fact[i] = mul(inv_fact[i + 1], i + 1);     }   }   int C(int n, int r) {     int num = fact[n], den = mul(inv_fact[r], inv_fact[n - r]);     return mul(num, den);   }   vector<int> upper;   const int r = 3, inv_r = poww(r, mod - 2);   void pre() {     int zz = poww(r, (mod - 1) >> LN), curr = 1;     for (int i = 0; i < maxn; i++) {       poww_r[i] = curr;       curr = mul(curr, zz);     }     for (int i = 0; i < maxn; i++) {       poww_inv_r[i] = (i == 0) ? 1 : poww_r[maxn - i];     }     fact[0] = 1;     for (int i = 1; i < maxn; i++) {       fact[i] = mul(fact[i - 1], i);     }     inv_fact[maxn - 1] = poww(fact[maxn - 1], mod - 2);     for (int i = maxn - 2; i >= 0; i--) {       inv_fact[i] = mul(inv_fact[i + 1], i + 1);     }   }   void fft(vector<int> &a, bool invert) {     int n = a.size();     for (int i = 1, j = 0; i < n; i++) {       int bit = n >> 1;       for (; j >= bit; bit >>= 1) {         j -= bit;       }       j += bit;       if (i < j) {         swap(a[i], a[j]);       }     }     for (int len = 2; len <= n; len <<= 1) {       int additive = maxn / len;       for (int i = 0; i < n; i += len) {         int now = 0;         for (int j = 0; j < len / 2; j++) {           int u = a[i + j],               v = mul(a[i + j + len / 2], invert ? poww_inv_r[now] : poww_r[now]);           a[i + j] = add(u, v);           a[i + j + len / 2] = add(u, mod - v);           now += additive;         }       }     }   }   vector<int> mult(vector<int> &a, vector<int> &b) {     int sz = 1;     while (sz < max(a.size(), b.size())) {       sz *= 2;     }     sz *= 2;     vector<int> fa(sz), fb(sz);     for (int i = 0; i < a.size(); i++) {       fa[i] = a[i];     }     for (int i = 0; i < b.size(); i++) {       fb[i] = b[i];     }     fft(fa, false);     fft(fb, false);     for (int i = 0; i < sz; i++) {       fa[i] = mul(fa[i], fb[i]);     }     fft(fa, true);     int inv_sz = poww(sz, mod - 2);     for (int i = 0; i < sz; i++) {       fa[i] = mul(fa[i], inv_sz);     }     while (fa.back() == 0) {       fa.pop_back();     }     return fa;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     build();     pre();     int n, m, k;     cin >> n >> m >> k;     upper.resize(k + 1);     upper[0] = 1;     int last_used = n;     for (int i = 1; i <= k; i++) {       upper[i] = mul(upper[i - 1], last_used);       last_used--;     }     vector<int> p1(k + 1), p2(k + 1);     int curr = 1;     for (int i = 0; i <= k; i++) {       p1[i] = mul(poww(i, k), inv_fact[i]);       p2[i] = mul(curr, inv_fact[i]);       curr = mul(curr, mod - 1);     }     vector<int> res = mult(p1, p2);     int ans = 0, inv = poww(m, mod - 2), curr_inv = inv;     for (int i = 1; i <= min(n, k); i++) {       int curr = mul(upper[i], curr_inv);       curr = mul(curr, res[i]);       ans = add(ans, curr);       curr_inv = mul(curr_inv, inv);     }     cout << ans << endl;     return 0;   }   