Problem p02653 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5000 + 10;
typedef long long LL;
const LL MOD = 1e9 + 7;
int n, A, B;
LL f[N][N][2];
LL g[N][N][2], w[N][2];
void add(LL &x, LL y) {
  x += y;
  if (x > MOD)
    x -= MOD;
}
int main() {
  cin >> n >> A >> B;
  if (A < B)
    swap(A, B);
  LL tot = 1;
  for (int i = 1; i <= n; i++)
    tot = tot * 2 % MOD;

  f[0][0][0] = 1;
  g[0][0][0] = 1;
  w[0][0] = 1;
  f[0][0][1] = 1;
  g[0][0][1] = 1;
  w[0][1] = 1;

  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < A; j++) {
      if (i >= 1 && j >= 1) {
        add(f[i][j][0], g[i - 1][j - 1][1]);
      }
      if (i - B >= 0 && j - B >= 0) {
        add(f[i][j][1], g[i - B][j - B][0]);
      }
    }
    for (int t = 1; t <= min(i, B - 1); t++) {
      add(f[i][0][1], w[i - t][0]);
    }
    g[i][0][1] = f[i][0][1];
    for (int j = 1; j < A; j++) {
      g[i][j][0] = (g[i - 1][j - 1][0] + f[i][j][0]) % MOD;
      g[i][j][1] = (g[i - 1][j - 1][1] + f[i][j][1]) % MOD;
    }

    for (int j = 0; j < A; j++) {
      add(w[i][0], f[i][j][0]);
      add(w[i][1], f[i][j][1]);
    }
  }
  for (int j = 0; j < A; j++) {
    for (int k = 0; k < 2; k++) {
      tot = tot - f[n][j][k];
      tot = (tot % MOD + MOD) % MOD;
    }
  }
  cout << tot << endl;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000 + 10;
typedef long long LL;
const LL MOD = 1e9 + 7;
int n, A, B;
LL f[N][N][2];
LL g[N][N][2], w[N][2];
void add(LL &x, LL y) {
  x += y;
  if (x > MOD)
    x -= MOD;
}
int main() {
  cin >> n >> A >> B;
  if (A < B)
    swap(A, B);
  LL tot = 1;
  for (int i = 1; i <= n; i++)
    tot = tot * 2 % MOD;

  f[0][0][0] = 1;
  g[0][0][0] = 1;
  w[0][0] = 1;
  f[0][0][1] = 1;
  g[0][0][1] = 1;
  w[0][1] = 1;

  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < A; j++) {
      /*
      for (int t = 1; t <= min(j, i); t ++) {
              // printf("(%d,%d,%d) -> (%d,%d,%d)\\n", i-t,j-t,1,i,j,0);
              add(f[i][j][0], f[i-t][j-t][1]);
      }
      */
      if (i >= 1 && j >= 1) {
        add(f[i][j][0], g[i - 1][j - 1][1]);
      }
      /*
      for (int t = B; t <= min(j, i); t ++) {
              // printf("(%d,%d,%d) -> (%d,%d,%d)\\n", i-t,j-t,0,i,j,1);
              add(f[i][j][1], f[i-t][j-t][0]);
      }
      */
      if (i - B >= 0 && j - B >= 0) {
        add(f[i][j][1], g[i - B][j - B][0]);
      }
      // printf("f[%d][%d] = {%lld, %lld}\\n", i, j, f[i][j][0], f[i][j][1]);
    }
    for (int t = 1; t <= min(i, B - 1); t++) {
      /*
      for (int s = 0; s < A; s ++){
              // printf("(%d,%d,%d) -> (%d,%d,%d)\\n", i-t,s,0,i,0,1);
              add(f[i][0][1], f[i-t][s][0]);
      }
      */
      add(f[i][0][1], w[i - t][0]);
    }
    g[i][0][1] = f[i][0][1];
    for (int j = 1; j < A; j++) {
      g[i][j][0] = (g[i - 1][j - 1][0] + f[i][j][0]) % MOD;
      g[i][j][1] = (g[i - 1][j - 1][1] + f[i][j][1]) % MOD;
    }

    for (int j = 0; j < A; j++) {
      add(w[i][0], f[i][j][0]);
      add(w[i][1], f[i][j][1]);
    }
  }
  for (int j = 0; j < A; j++) {
    for (int k = 0; k < 2; k++) {
      tot = tot - f[n][j][k];
      tot = (tot % MOD + MOD) % MOD;
    }
  }
  cout << tot << endl;
}