Problem p03332 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) x
#define WATCH(x) TRACE(cout << #x " = " << x << endl)
#define WATCHR(a, b)                                                           \
  TRACE(for (auto it = a; it != b;) cout << *(it++) << " "; cout << endl)
#define WATCHC(V)                                                              \
  TRACE({                                                                      \
    cout << #V " = ";                                                          \
    WATCHR(V.begin(), V.end());                                                \
  })

#define all(x) (x).begin(), (x).end()

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vs = vector<string>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template <int MOD> struct modnum {
  int v;
  modnum() : v(0) {}
  modnum(ll _v) : v(_v % MOD) {
    if (v < 0)
      v += MOD;
  }
  explicit operator int() const { return v; }
  friend ostream &operator<<(ostream &o, const modnum &n) { return o << n.v; }
  friend istream &operator<<(istream &i, modnum &n) {
    ll v;
    i >> v;
    n = modnum(v);
    return i;
  }

  friend bool operator==(const modnum &a, const modnum &b) {
    return a.v == b.v;
  }
  friend bool operator!=(const modnum &a, const modnum &b) {
    return a.v != b.v;
  }

  modnum &operator+=(const modnum &o) {
    v += o.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  modnum &operator-=(const modnum &o) {
    v -= o.v;
    if (v < 0)
      v += MOD;
    return *this;
  }
  modnum &operator*=(const modnum &o) {
    v = int(ll(v) * ll(o.v) % MOD);
    return *this;
  }
  modnum operator-() {
    modnum res;
    if (v)
      res.v = MOD - v;
    return res;
  }
  friend modnum operator+(const modnum &a, const modnum &b) {
    return modnum(a) += b;
  }
  friend modnum operator-(const modnum &a, const modnum &b) {
    return modnum(a) -= b;
  }
  friend modnum operator*(const modnum &a, const modnum &b) {
    return modnum(a) *= b;
  }

  modnum pow(int e) const {
    if (e == 0)
      return 1;
    if (e & 1)
      return *this * this->pow(e - 1);
    return (*this * *this).pow(e / 2);
  }

  modnum inv() const {
    int g = MOD, x = 0, y = 1;
    for (int r = v; r != 0;) {
      int q = g / r;
      g %= r;
      swap(g, r);
      x -= q * y;
      swap(x, y);
    }

    assert(g == 1);
    assert(y == MOD || y == -MOD);
    return x < 0 ? x + MOD : x;
  }
  modnum &operator/=(const modnum &o) { return (*this) *= o.inv(); }
  friend modnum operator/(const modnum &a, const modnum &b) {
    return modnum(a) /= modnum(b);
  }
};

using mn = modnum<998244353>;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);

  const int MAXV = 3.1e5;
  vector<mn> fact(MAXV);
  fact[0] = 1;
  for (int v = 1; v < MAXV; v++)
    fact[v] = v * fact[v - 1];

  auto ncr = [&fact](int n, ll r) {
    if (r > n)
      return mn(0);
    return fact[n] / (fact[r] * fact[n - r]);
  };

  int N, A, B;
  ll K;

  cin >> N >> A >> B >> K;

  mn ans = 0;

  for (int ac = 0; ac <= N; ac++) {
    ll rem = K - ll(ac) * A;
    if (rem % B)
      continue;

    ll bc = rem / B;
    ans += ncr(N, ac) * ncr(N, bc);
  }

  cout << ans << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) x
#define WATCH(x) TRACE(cout << #x " = " << x << endl)
#define WATCHR(a, b)                                                           \
  TRACE(for (auto it = a; it != b;) cout << *(it++) << " "; cout << endl)
#define WATCHC(V)                                                              \
  TRACE({                                                                      \
    cout << #V " = ";                                                          \
    WATCHR(V.begin(), V.end());                                                \
  })

#define all(x) (x).begin(), (x).end()

using ll = long long;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vs = vector<string>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

template <int MOD> struct modnum {
  int v;
  modnum() : v(0) {}
  modnum(ll _v) : v(_v % MOD) {
    if (v < 0)
      v += MOD;
  }
  explicit operator int() const { return v; }
  friend ostream &operator<<(ostream &o, const modnum &n) { return o << n.v; }
  friend istream &operator<<(istream &i, modnum &n) {
    ll v;
    i >> v;
    n = modnum(v);
    return i;
  }

  friend bool operator==(const modnum &a, const modnum &b) {
    return a.v == b.v;
  }
  friend bool operator!=(const modnum &a, const modnum &b) {
    return a.v != b.v;
  }

  modnum &operator+=(const modnum &o) {
    v += o.v;
    if (v >= MOD)
      v -= MOD;
    return *this;
  }
  modnum &operator-=(const modnum &o) {
    v -= o.v;
    if (v < 0)
      v += MOD;
    return *this;
  }
  modnum &operator*=(const modnum &o) {
    v = int(ll(v) * ll(o.v) % MOD);
    return *this;
  }
  modnum operator-() {
    modnum res;
    if (v)
      res.v = MOD - v;
    return res;
  }
  friend modnum operator+(const modnum &a, const modnum &b) {
    return modnum(a) += b;
  }
  friend modnum operator-(const modnum &a, const modnum &b) {
    return modnum(a) -= b;
  }
  friend modnum operator*(const modnum &a, const modnum &b) {
    return modnum(a) *= b;
  }

  modnum pow(int e) const {
    if (e == 0)
      return 1;
    if (e & 1)
      return *this * this->pow(e - 1);
    return (*this * *this).pow(e / 2);
  }

  modnum inv() const {
    int g = MOD, x = 0, y = 1;
    for (int r = v; r != 0;) {
      int q = g / r;
      g %= r;
      swap(g, r);
      x -= q * y;
      swap(x, y);
    }

    assert(g == 1);
    assert(y == MOD || y == -MOD);
    return x < 0 ? x + MOD : x;
  }
  modnum &operator/=(const modnum &o) { return (*this) *= o.inv(); }
  friend modnum operator/(const modnum &a, const modnum &b) {
    return modnum(a) /= modnum(b);
  }
};

using mn = modnum<998244353>;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);

  const int MAXV = 3.1e5;
  vector<mn> fact(MAXV);
  fact[0] = 1;
  for (int v = 1; v < MAXV; v++)
    fact[v] = v * fact[v - 1];

  auto ncr = [&fact](int n, ll r) {
    if (r > n || r < 0)
      return mn(0);
    return fact[n] / (fact[r] * fact[n - r]);
  };

  int N, A, B;
  ll K;

  cin >> N >> A >> B >> K;

  mn ans = 0;

  for (int ac = 0; ac <= N; ac++) {
    ll rem = K - ll(ac) * A;
    if (rem % B)
      continue;

    ll bc = rem / B;
    ans += ncr(N, ac) * ncr(N, bc);
  }

  cout << ans << endl;

  return 0;
}