func_code_string: #include <bits/stdc++.h>   using namespace std;   long long mod = 998244353;   long long binpow(long long a, long long p) {     return p ? binpow(a * a % mod, p >> 1) * (p & 1 ? a : 1) % mod : 1;   }   long long bininv(long long a) { return binpow(a, mod - 2); }   set<int> solved;   map<long long, vector<long long> > mp;   vector<vector<long long> > C;   int k, kk;   long long m, invm;   long long fact[35000];   long long ifact[35000];   struct FFT {     int n;     vector<long long> w;     vector<long long> inv;     void set(int _n = (1 << 14)) {       n = _n;       inv.resize(n);       inv[0] = 0;       for (int i = 1, j = 0; i < n; i++) {         int bit = (n >> 1);         while (bit & j) {           j ^= bit;           bit >>= 1;         }         j ^= bit;         inv[i] = j;       }       w.resize(n);       long long step = binpow(3, (mod - 1) / n);       w[0] = 1;       for (int i = 1; i < n; i++) {         w[i] = w[i - 1] * step % mod;       }     }     void fft(vector<long long>& a) {       for (int i = 0; i < n; i++) {         if (i < inv[i]) {           swap(a[i], a[inv[i]]);         }       }       for (int len = 2; len <= n; len <<= 1) {         for (int i = 0; i < n; i += len) {           int i1 = i, i2 = i + (len >> 1);           int wind = 0, wstep = (n / len);           for (; i2 < i + len; i1++, i2++, wind += wstep) {             long long x = a[i1], y = a[i2] * w[wind] % mod;             a[i1] = (x + y) % mod;             a[i2] = (x - y + mod) % mod;           }         }       }     }     void ifft(vector<long long>& a) {       fft(a);       reverse(a.begin() + 1, a.end());       long long invn = binpow(n, mod - 2);       for (int i = 0; i < n; i++) {         a[i] = (a[i] * invn) % mod;       }     }     void do_calculation(vector<long long> a, vector<long long> b,                         vector<long long>& to) {       fft(a);       fft(b);       for (int i = 0; i < n; i++) {         to[i] = a[i] * b[i] % mod;       }       ifft(to);       for (int i = k + 1; i < n; i++) {         to[i] = 0;       }     }   } fft;   void prec() {     fact[0] = ifact[0] = 1;     for (int i = 1; i < 35000; i++) {       fact[i] = fact[i - 1] * i % mod;       ifact[i] = binpow(fact[i], mod - 2);     }   }   void calc(long long n) {     if (solved.count(n)) return;     if (n == 1) {       vector<long long> tmp(k + 1, invm);       tmp[0] = 1;       for (int i = 0; i < k + 1; i++) {         tmp[i] = tmp[i] * ifact[i] % mod;       }       while (tmp.size() < kk) {         tmp.push_back(0);       }       mp[1] = tmp;     } else if (n & 1) {       calc(n - 1);       mp[n] = vector<long long>(kk, 0);       fft.do_calculation(mp[1], mp[n - 1], mp[n]);       mp[n][0] = 1;     } else {       calc(n / 2);       mp[n] = vector<long long>(kk, 0);       fft.do_calculation(mp[n / 2], mp[n / 2], mp[n]);       mp[n][0] = 1;     }     solved.insert(n);   }   void solve(int test_ind) {     int st = clock();     prec();     long long n;     cin >> n >> m >> k;     kk = 1;     while (kk < k) {       kk <<= 1;     }     kk <<= 1;     fft.set(kk);     invm = bininv(m);     calc(n);     cout << mp[n][k] * fact[k] % mod << endl;   }   int main() {     int t = 1;     for (int i = 0; i < t; i++) {       solve(i);     }     return 0;   }   