Problem p02685 (C++)

Buggy submission (status: Runtime Error):
// ABC167-E
#include <bits/stdc++.h>
#define endl "\n"
#define rep(i, n) for (int i = 0; i < int(n); i++)
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
template <class T> ostream &operator<<(ostream &o, const vector<T> &v) {
  o << "{";
  for (int i = 0; i < (int)v.size(); i++)
    o << (i > 0 ? ", " : "") << v[i];
  o << "}";
  return o;
}
namespace you {
std::string to_string(char val) {
  return std::string(1, val);
  // return std::string{val};
  // you::to_string(char)
}
} // namespace you

ll modpow(ll x, ll y, ll mod) { // x^y
  if (y == 1)
    return x % mod;
  if (y % 2 == 1)
    return x * modpow(x, y - 1, mod) % mod;
  ll t = modpow(x, y / 2, mod);
  return (t * t) % mod;
}
vector<ll> fact(210000);
vector<ll> invfact(210000);
ll nck(ll n, ll k, ll mod) {
  if (n < k or k < 0)
    return 0;
  return (fact[n] * invfact[k]) % mod * invfact[n - k] % mod;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(12);

  int n, m, k;
  cin >> n >> m >> k;
  int mod = 998244353;
  fact[0] = 1;
  for (int i = 1; i < 210000; i++) {
    fact[i] = fact[i - 1] * i % mod;
  }
  // cout<<fact[20000]<<endl;
  invfact[210000 - 1] = modpow(fact[210000 - 1], mod - 2, mod);
  // cout<<modpow(fact[210000-1],mod-2,mod)<<endl;
  for (int i = 210000 - 2; i > -1; i = i - 1) {
    invfact[i] = invfact[i + 1] * (i + 1) % mod;
  }
  ll ans = 0;
  for (int i = 0; i <= k; i++) {
    ll num =
        (nck(n - 1, i, mod) * m) % mod * modpow(m - 1, n - i - 1, mod) % mod;
    // cout<<nck(n-1,i)<<endl;
    // cout<<modpow(m-1,n-i-1,mod)<<endl;
    ans += num;
    ans %= mod;
  }
  cout << ans << endl;
  return 0;
}

Fixed submission:
// ABC167-E
#include <bits/stdc++.h>
#define endl "\n"
#define rep(i, n) for (int i = 0; i < int(n); i++)
#define SZ(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
template <class T> ostream &operator<<(ostream &o, const vector<T> &v) {
  o << "{";
  for (int i = 0; i < (int)v.size(); i++)
    o << (i > 0 ? ", " : "") << v[i];
  o << "}";
  return o;
}
namespace you {
std::string to_string(char val) {
  return std::string(1, val);
  // return std::string{val};
  // you::to_string(char)
}
} // namespace you

ll modpow(ll x, ll y, ll mod) { // x^y
  if (y == 0)
    return 1;
  if (y == 1)
    return x % mod;
  if (y % 2 == 1)
    return x * modpow(x, y - 1, mod) % mod;
  ll t = modpow(x, y / 2, mod);
  return (t * t) % mod;
}
vector<ll> fact(210000);
vector<ll> invfact(210000);
ll nck(ll n, ll k, ll mod) {
  if (n < k or k < 0)
    return 0;
  return (fact[n] * invfact[k]) % mod * invfact[n - k] % mod;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(12);

  int n, m, k;
  cin >> n >> m >> k;
  int mod = 998244353;
  fact[0] = 1;
  for (int i = 1; i < 210000; i++) {
    fact[i] = fact[i - 1] * i % mod;
  }
  // cout<<fact[20000]<<endl;
  invfact[210000 - 1] = modpow(fact[210000 - 1], mod - 2, mod);
  // cout<<modpow(fact[210000-1],mod-2,mod)<<endl;
  for (int i = 210000 - 2; i > -1; i = i - 1) {
    invfact[i] = invfact[i + 1] * (i + 1) % mod;
  }
  ll ans = 0;
  for (int i = 0; i <= k; i++) {
    ll num =
        (nck(n - 1, i, mod) * m) % mod * modpow(m - 1, n - i - 1, mod) % mod;
    // cout<<nck(n-1,i)<<endl;
    // cout<<modpow(m-1,n-i-1,mod)<<endl;
    ans += num;
    ans %= mod;
  }
  cout << ans << endl;
  return 0;
}