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

#include <bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for (int i = a; i < (int)b; i++)
#define rep(i, n) REP(i, 0, n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
#define watch(a)                                                               \\
  { std::cout << #a << " = " << a << "\\n"; }
template <class T1, class T2> inline bool minimize(T1 &a, T2 b) {
  return b < a && (a = b, 1);
}
template <class T1, class T2> inline bool maximize(T1 &a, T2 b) {
  return a < b && (a = b, 1);
}
template <class T, class V> istream &operator>>(istream &ist, pair<T, V> &p) {
  return ist >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &ost, pair<T, T> &p) {
  return ost << p.first << ", " << p.second;
}
template <class T> istream &operator>>(istream &ist, vector<T> &vs) {
  for (auto &e : vs)
    ist >> e;
  return ist;
}

typedef long long ll;
int const inf = INT_MAX / 2;

constexpr ll MOD = 998244353;

namespace math {
namespace integer {

ll mod_pow(ll x, ll n, ll mod) {
  if (n == 0) {
    return 1;
  }
  if (n % 2 == 0) {
    return mod_pow(x * x % mod, n / 2, mod);
  } else {
    return x * mod_pow(x, n - 1, mod) % mod;
  }
}
template <class T> T extgcd(T a, T b, T &x, T &y) {
  T d = a;
  if (b != 0) {
    d = extgcd(b, a % b, y, x);
    y -= (a / b) * x;
  } else {
    x = 1, y = 0;
  }
  return d;
}
template <class T> T mod_inverse(T x, T mod) {
  return mod_pow(x, T(mod - 2), mod); /* use fermat */
}
template <class T> T mod_inverse_composite_num_mod(T a, ll mod) {
  T x, y;
  extgcd(a, mod, x, y);
  return (mod + x % mod) % mod;
}

} // namespace integer
} // namespace math
using namespace math::integer;

namespace math {

constexpr int MaxFact = 200020;

template <class T = ll> struct FactRevFactList {
  array<T, MaxFact + 1> fact_;
  array<T, MaxFact + 1> rev_fact_;

  FactRevFactList() {
    fact_[0] = 1;
    for (int i = 1; i < MaxFact; i++) {
      fact_[i] = fact_[i - 1] * i;
      fact_[i] %= MOD;
    }

    rev_fact_[MaxFact - 1] = mod_pow(fact_[MaxFact - 1], (T)MOD - 2, MOD);

    for (int i = MaxFact - 2; i >= 0; i--) {
      rev_fact_[i] = rev_fact_[i + 1] * (i + 1);
      rev_fact_[i] %= MOD;
    }
  }

  T fact(int x) const { return fact_[x]; }
  T fact_inv(int x) const { return rev_fact_[x]; }
};

template <class T = ll> struct CombinationBig {
  math::FactRevFactList<> fr_;
  T comb(T n, T r) {
    return (fr_.fact(n) * fr_.fact_inv(r) % MOD) * fr_.fact_inv(n - r) % MOD;
  }
};

} // namespace math

math::CombinationBig<> cbig;

int main() {
  ll N, M, K;
  cin >> N >> M >> K;
  ll ans = 0;
  rep(k, K + 1) {
    auto c = cbig.comb(N - 1, k) % MOD;
    c *= mod_pow(M - 1, N - k - 1, MOD) % MOD;
    ans += c % MOD;
    ans %= MOD;
  }
  ans *= M;
  ans %= MOD;
  cout << ans << endl;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define REP(i, a, b) for (int i = a; i < (int)b; i++)
#define rep(i, n) REP(i, 0, n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
#define watch(a)                                                               \\
  { std::cout << #a << " = " << a << "\\n"; }
template <class T1, class T2> inline bool minimize(T1 &a, T2 b) {
  return b < a && (a = b, 1);
}
template <class T1, class T2> inline bool maximize(T1 &a, T2 b) {
  return a < b && (a = b, 1);
}
template <class T, class V> istream &operator>>(istream &ist, pair<T, V> &p) {
  return ist >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &ost, pair<T, T> &p) {
  return ost << p.first << ", " << p.second;
}
template <class T> istream &operator>>(istream &ist, vector<T> &vs) {
  for (auto &e : vs)
    ist >> e;
  return ist;
}

typedef long long ll;
int const inf = INT_MAX / 2;

constexpr ll MOD = 998244353;

namespace math {
namespace integer {

template <class T> T mod_mul(T x, T k, T m) {
  if (k == 0) {
    return 0;
  }
  if (k % 2 == 0) {
    return mod_mul((x + x) % m, k / 2, m);
  } else {
    return (x + mod_mul(x, k - 1, m)) % m;
  }
}
template <class T> T mod_pow(T x, T n, T mod) {
  if (n == 0) {
    return 1;
  }
  if (n % 2 == 0) {
    return mod_pow(mod_mul(x, x, mod) % mod, n / 2, mod);
  } else {
    return mod_mul(x, mod_pow(x, n - 1, mod), mod);
  }
}
template <class T> T extgcd(T a, T b, T &x, T &y) {
  T d = a;
  if (b != 0) {
    d = extgcd(b, a % b, y, x);
    y -= (a / b) * x;
  } else {
    x = 1, y = 0;
  }
  return d;
}
template <class T> T mod_inverse(T x, T mod) {
  return mod_pow(x, T(mod - 2), mod); /* use fermat */
}
template <class T> T mod_inverse_composite_num_mod(T a, ll mod) {
  T x, y;
  extgcd(a, mod, x, y);
  return (mod + x % mod) % mod;
}

} // namespace integer
} // namespace math
using namespace math::integer;

namespace math {

constexpr int MaxFact = 200020;

template <class T = ll> struct FactRevFactList {
  array<T, MaxFact + 1> fact_;
  array<T, MaxFact + 1> rev_fact_;

  FactRevFactList() {
    fact_[0] = 1;
    for (int i = 1; i < MaxFact; i++) {
      fact_[i] = fact_[i - 1] * i;
      fact_[i] %= MOD;
    }

    rev_fact_[MaxFact - 1] = mod_pow(fact_[MaxFact - 1], (T)MOD - 2, MOD);

    for (int i = MaxFact - 2; i >= 0; i--) {
      rev_fact_[i] = rev_fact_[i + 1] * (i + 1);
      rev_fact_[i] %= MOD;
    }
  }

  T fact(int x) const { return fact_[x]; }
  T fact_inv(int x) const { return rev_fact_[x]; }
};

template <class T = ll> struct CombinationBig {
  math::FactRevFactList<> fr_;
  T comb(T n, T r) {
    return (fr_.fact(n) * fr_.fact_inv(r) % MOD) * fr_.fact_inv(n - r) % MOD;
  }
};

} // namespace math

math::CombinationBig<> cbig;

int main() {
  ll N, M, K;
  cin >> N >> M >> K;
  ll ans = 0;
  rep(k, K + 1) {
    auto c = cbig.comb(N - 1, k) % MOD;
    c *= mod_pow(M - 1, N - k - 1, MOD) % MOD;
    ans += c % MOD;
    ans %= MOD;
  }
  ans *= M;
  ans %= MOD;
  cout << ans << endl;
}