Problem p03332 (C++)

Buggy submission (status: Runtime Error):
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>
#include <vector>
using namespace std;

#define LL long long

#define fi first
#define se second
#define lson l, mid, id << 1
#define rson mid + 1, r, id << 1 | 1
#define ls id << 1
#define rs id << 1 | 1
#define MID(a, b) (((a) + (b)) >> 1)
#define maxx(a, b) ((a) < (b) ? (b) : (a))
#define minx(a, b) ((a) < (b) ? (a) : (b))
#define absx(a) ((a) < 0 ? -(a) : (a))
#define mk(a, b) make_pair(a, b)
#define pb(a) push_back(a)
#define itr iterator
#define lowbit(x) ((x) & -(x))

typedef unsigned LL ULL;
typedef unsigned uint;
typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<LL, LL> pLL;

template <typename T> inline void read(T &x) {
  static bool fr_f;
  static char fr_ch;
  fr_f = 0;
  x = 0;
  fr_ch = getchar();
  while (fr_ch < '0' || '9' < fr_ch) {
    if (fr_ch == '-')
      fr_f = 1;
    fr_ch = getchar();
  }
  while ('0' <= fr_ch && fr_ch <= '9') {
    x = (x << 1) + (x << 3) + fr_ch - '0';
    fr_ch = getchar();
  }
  if (fr_f)
    x = -x;
}

template <typename T> inline void Max(T &a, T b) {
  if (a < b)
    a = b;
}
template <typename T> inline void Min(T &a, T b) {
  if (b < a)
    a = b;
}
template <typename T> inline void Swap(T &a, T &b) {
  T c = a;
  a = b;
  b = c;
}
template <typename T> inline T Abs(T a) {
  if (a < 0)
    return -a;
  else
    return a;
}

const double pi = acos(-1.0);
const int MOD = (int)1e9 + 7;
const int INF = (int)0x3f3f3f3f;
const LL LINF = (LL)INF << 32 | INF;
const int SINF = (uint)(-1) >> 1;
const LL SLINF = (ULL)(-1) >> 1;
const double DINF = 1e50;
const double eps = 1e-5;
const int maxn = (int)4e5 + 20;
const int maxm = (int)1e6 + 20;
const int maxk = (int)1000 + 20;

inline int sig(double x) { return x < -eps ? -1 : x > eps; }
inline LL fp(LL a, LL n, LL p) {
  LL res = 1;
  for (; n; n >>= 1, a = a * a % p)
    if (n & 1)
      res = res * a % p;
  return res;
}
template <typename T> inline T gcd(T a, T b) {
  for (T c; b; c = a % b, a = b, b = c)
    ;
  return a;
}

//--------------------start--------------------

LL N, A, B, K;
LL mod = 998244353;

LL C[maxn];

void work() {
  read(N);

  C[0] = 1;
  for (int i = 1; i <= N; i++) {
    C[i] = (((C[i - 1] * fp(i, mod - 2, mod)) % mod) * (N - i + 1)) % mod;
  }

  //    for(int i = 0; i <= N; i++)
  //        cout <<C[i] <<endl;

  read(A), read(B);
  read(K);

  LL ans = 0;
  for (int i = 0; i <= N; i++) {
    LL tmp = K - A * i;
    if (N < 0)
      continue;
    if (tmp % B)
      continue;
    if (tmp / B > N)
      continue;
    int j = tmp / B;

    ans += C[i] * C[j];
    ans %= mod;
  }

  cout << ans << endl;
}

//---------------------end---------------------

int main() {
#ifdef yukihana0416
  freopen("in.txt", "r", stdin);
// freopen("out.txt","w",stdout);
#endif // yukihana0416
  work();
  return 0;
}


Fixed submission:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>
#include <vector>
using namespace std;

#define LL long long

#define fi first
#define se second
#define lson l, mid, id << 1
#define rson mid + 1, r, id << 1 | 1
#define ls id << 1
#define rs id << 1 | 1
#define MID(a, b) (((a) + (b)) >> 1)
#define maxx(a, b) ((a) < (b) ? (b) : (a))
#define minx(a, b) ((a) < (b) ? (a) : (b))
#define absx(a) ((a) < 0 ? -(a) : (a))
#define mk(a, b) make_pair(a, b)
#define pb(a) push_back(a)
#define itr iterator
#define lowbit(x) ((x) & -(x))

typedef unsigned LL ULL;
typedef unsigned uint;
typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<LL, LL> pLL;

template <typename T> inline void read(T &x) {
  static bool fr_f;
  static char fr_ch;
  fr_f = 0;
  x = 0;
  fr_ch = getchar();
  while (fr_ch < '0' || '9' < fr_ch) {
    if (fr_ch == '-')
      fr_f = 1;
    fr_ch = getchar();
  }
  while ('0' <= fr_ch && fr_ch <= '9') {
    x = (x << 1) + (x << 3) + fr_ch - '0';
    fr_ch = getchar();
  }
  if (fr_f)
    x = -x;
}

template <typename T> inline void Max(T &a, T b) {
  if (a < b)
    a = b;
}
template <typename T> inline void Min(T &a, T b) {
  if (b < a)
    a = b;
}
template <typename T> inline void Swap(T &a, T &b) {
  T c = a;
  a = b;
  b = c;
}
template <typename T> inline T Abs(T a) {
  if (a < 0)
    return -a;
  else
    return a;
}

const double pi = acos(-1.0);
const int MOD = (int)1e9 + 7;
const int INF = (int)0x3f3f3f3f;
const LL LINF = (LL)INF << 32 | INF;
const int SINF = (uint)(-1) >> 1;
const LL SLINF = (ULL)(-1) >> 1;
const double DINF = 1e50;
const double eps = 1e-5;
const int maxn = (int)4e5 + 20;
const int maxm = (int)1e6 + 20;
const int maxk = (int)1000 + 20;

inline int sig(double x) { return x < -eps ? -1 : x > eps; }
inline LL fp(LL a, LL n, LL p) {
  LL res = 1;
  for (; n; n >>= 1, a = a * a % p)
    if (n & 1)
      res = res * a % p;
  return res;
}
template <typename T> inline T gcd(T a, T b) {
  for (T c; b; c = a % b, a = b, b = c)
    ;
  return a;
}

//--------------------start--------------------

LL N, A, B, K;
LL mod = 998244353;

LL C[maxn];

void work() {
  read(N);

  C[0] = 1;
  for (int i = 1; i <= N; i++) {
    C[i] = (((C[i - 1] * fp(i, mod - 2, mod)) % mod) * (N - i + 1)) % mod;
  }

  //    for(int i = 0; i <= N; i++)
  //        cout <<C[i] <<endl;

  read(A), read(B);
  read(K);

  LL ans = 0;
  for (int i = 0; i <= N; i++) {
    LL tmp = K - A * i;
    if (tmp < 0)
      continue;
    if (tmp % B)
      continue;
    if (tmp / B > N)
      continue;
    int j = tmp / B;

    ans += C[i] * C[j];
    ans %= mod;
  }

  cout << ans << endl;
}

//---------------------end---------------------

int main() {
#ifdef yukihana0416
  freopen("in.txt", "r", stdin);
// freopen("out.txt","w",stdout);
#endif // yukihana0416
  work();
  return 0;
}