Problem p02555 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#include <iostream>
#include <string>
#define ll long long int
#define ld long double
#define pb push_back
#define endl "\n"
#define mp make_pair
#define sz(v) (int)(v.size())
#define len(s) (int)(s.length())
#define M (ll)(1e9 + 7)
#define all(v) v.begin(), v.end()
#define fr(a, b, c) for (ll i = a; i <= b; i += c)
#define inarr(arr, n)                                                          \
  ;                                                                            \
  for (ll i = 0; i < n; i++)                                                   \
    cin >> arr[i];
#define outarr(arr, n)                                                         \
  ;                                                                            \
  for (ll i = 0; i < n; i++)                                                   \
    cout << arr[i] << " ";
#define ios                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0);
const ll inf = 9e18;
const ld pi = 2 * acos(0.0);
using namespace std;
ll power(ll a, ll n) {
  if (n == 0) {
    return 1;
  }
  ll p = power(a, n / 2) % M;
  p = (p * p) % M;
  if (n % 2 == 1) {
    p = (p * a) % M;
  }
  return p;
}
ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  return gcd(b % a, a);
}
const int N = 1e6;
vector<ll> sieve(N, 0);
void si() {
  sieve[1] = 1;
  for (int i = 2; i < N; i++) {
    if (sieve[i] == 0) {
      for (int j = i; j < N; j += i) {
        sieve[j] = i;
      }
    }
  }
}
int main() {
  ios;
  vector<ll> fact(4005, 0);
  fact[0] = 1;
  for (ll i = 1; i <= 4005; i++) {
    fact[i] = (fact[i - 1] * i) % M;
  }
  ll s;
  cin >> s;
  ll ans = 0;
  for (ll i = 1; i <= 666; i++) {
    ll z = 3 * i;
    ll n = s - z;
    if (n < 0) {
      break;
    }
    ll k = fact[n + i - 1];
    ll div1 = power(fact[i - 1], M - 2) % M;
    ll div2 = power(fact[n], M - 2) % M;
    ll add = (((k * div1) % M) * div2) % M;
    ans += add;
    ans = ans % M;
  }
  cout << ans << endl;
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#include <iostream>
#include <string>
#define ll long long int
#define ld long double
#define pb push_back
#define endl "\n"
#define mp make_pair
#define sz(v) (int)(v.size())
#define len(s) (int)(s.length())
#define M (ll)(1e9 + 7)
#define all(v) v.begin(), v.end()
#define fr(a, b, c) for (ll i = a; i <= b; i += c)
#define inarr(arr, n)                                                          \
  ;                                                                            \
  for (ll i = 0; i < n; i++)                                                   \
    cin >> arr[i];
#define outarr(arr, n)                                                         \
  ;                                                                            \
  for (ll i = 0; i < n; i++)                                                   \
    cout << arr[i] << " ";
#define ios                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0);
const ll inf = 9e18;
const ld pi = 2 * acos(0.0);
using namespace std;
ll power(ll a, ll n) {
  if (n == 0) {
    return 1;
  }
  ll p = power(a, n / 2) % M;
  p = (p * p) % M;
  if (n % 2 == 1) {
    p = (p * a) % M;
  }
  return p;
}
ll gcd(ll a, ll b) {
  if (a == 0)
    return b;
  return gcd(b % a, a);
}
const int N = 1e6;
vector<ll> sieve(N, 0);
void si() {
  sieve[1] = 1;
  for (int i = 2; i < N; i++) {
    if (sieve[i] == 0) {
      for (int j = i; j < N; j += i) {
        sieve[j] = i;
      }
    }
  }
}
int main() {
  ios;
  vector<ll> fact(4005, 0);
  fact[0] = 1;
  for (ll i = 1; i <= 4000; i++) {
    fact[i] = (fact[i - 1] * i) % M;
  }
  ll s;
  cin >> s;
  ll ans = 0;
  for (ll i = 1; i <= 666; i++) {
    ll z = 3 * i;
    ll n = s - z;
    if (n < 0) {
      break;
    }
    ll k = fact[n + i - 1];
    ll div1 = power(fact[i - 1], M - 2) % M;
    ll div2 = power(fact[n], M - 2) % M;
    ll add = (((k * div1) % M) * div2) % M;
    ans += add;
    ans = ans % M;
  }
  cout << ans << endl;
  return 0;
}