Problem p02685 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll mod = 998244353;

struct mint {
  ll v;
  mint(ll a = 0) : v((a % mod + mod) % mod) {}
  mint operator-() const { return mint(-v); }
  mint &operator+=(const mint a) {
    if ((v += a.v) >= mod)
      v -= mod;
    return *this;
  }
  mint &operator-=(const mint a) {
    if ((v += mod - a.v) >= mod)
      v -= mod;
    return *this;
  }
  mint &operator*=(const mint a) {
    (v *= a.v) %= mod;
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res *= a;
  }
  // v^t
  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  // Fermat's little theorem : a^(p-1) = 1 (mod p) when p is prime and a = 1
  // (mod p)
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint a) { return (*this) *= a.inv(); }
  mint operator/(const mint a) const {
    mint res(*this);
    return res /= a;
  }

  // k < 10^6, n < 10^9
  static mint comb(ll n, ll k) {
    mint num(1), den(1);
    for (int i = 0; i < k; i++) {
      num *= mint(n - i);
      den *= mint(i + 1);
    }
    return num / den;
  }
};

// for cout <<
ostream &operator<<(ostream &stream, const mint a) {
  stream << a.v;
  return stream;
}
int main() {
  ll n, m, k;
  cin >> n >> m >> k;
  mint ans(0), mm(m), m1(m - 1);
  mint comb = mint::comb(n - 1, k);
  mint powk = mint(m - 1).pow(n - k - 1);
  for (ll i = k; i >= 0; i--) {
    // ans += mint(m) * mint::comb(n-1, i) * mint(m-1).pow(n-i-1);
    ans += mm * comb * powk;
    powk *= m1;
    comb *= i;
    comb /= (n - i);
  }

  cout << ans << endl;
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll mod = 998244353;

struct mint {
  ll v;
  mint(ll a = 0) : v((a % mod + mod) % mod) {}
  mint operator-() const { return mint(-v); }
  mint &operator+=(const mint a) {
    if ((v += a.v) >= mod)
      v -= mod;
    return *this;
  }
  mint &operator-=(const mint a) {
    if ((v += mod - a.v) >= mod)
      v -= mod;
    return *this;
  }
  mint &operator*=(const mint a) {
    (v *= a.v) %= mod;
    return *this;
  }
  mint operator+(const mint a) const {
    mint res(*this);
    return res += a;
  }
  mint operator-(const mint a) const {
    mint res(*this);
    return res -= a;
  }
  mint operator*(const mint a) const {
    mint res(*this);
    return res *= a;
  }
  // v^t
  mint pow(ll t) const {
    if (!t)
      return 1;
    mint a = pow(t >> 1);
    a *= a;
    if (t & 1)
      a *= *this;
    return a;
  }

  // for prime mod
  // Fermat's little theorem : a^(p-1) = 1 (mod p) when p is prime and a = 1
  // (mod p)
  mint inv() const { return pow(mod - 2); }
  mint &operator/=(const mint a) { return (*this) *= a.inv(); }
  mint operator/(const mint a) const {
    mint res(*this);
    return res /= a;
  }

  // k < 10^6, n < 10^9
  static mint comb(ll n, ll k) {
    mint num(1), den(1);
    for (int i = 0; i < k; i++) {
      num *= mint(n - i);
      den *= mint(i + 1);
    }
    return num / den;
  }
};

// for cout <<
ostream &operator<<(ostream &stream, const mint a) {
  stream << a.v;
  return stream;
}
int main() {
  ll n, m, k;
  cin >> n >> m >> k;
  mint ans(0);
  for (ll i = 0; i <= k; i++) {
    ans += mint(m) * mint::comb(n - 1, i) * mint(m - 1).pow(n - i - 1);
  }

  cout << ans << endl;
  return 0;
}