Problem p02555 (C++) — buggy submission, verdict: Time Limit Exceeded


#include <bits/stdc++.h>
using namespace std;
/**
******************* Author:Bisnu sarkar ****************************
**/

#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")

#define fRead(x) freopen(x, "r", stdin)
#define fWrite(x) freopen(x, "w", stdout)
#define ull unsigned long long
#define ll long long
#define pii pair<int, int>
#define sit set<int>::iterator
#define vrit vector<int>::reverse iterator
#define ff first
#define ss second
#define endl '\\n';
#define sz(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define IO ios_base::sync_with_stdio(false), cin.tie(NULL);
#define what_is(x) cerr << #x << " is " << x << endl;
///*....Debugger....*///
#define error(args...)                                                         \\
  {                                                                            \\
    string _s = #args;                                                         \\
    replace(_s.begin(), _s.end(), ',', ' ');                                   \\
    stringstream _ss(_s);                                                      \\
    istream_iterator<string> _it(_ss);                                         \\
    err(_it, args);                                                            \\
  }
void err(istream_iterator<string> it) { cout << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << ", ";
  err(++it, args...);
}
///*....Input....*///
template <typename T> inline void Int(T &n) {
  n = 0;
  int f = 1;
  register int ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-')
      f = -1;
  for (; isdigit(ch); ch = getchar())
    n = (n << 3) + (n << 1) + ch - '0';
  n = n * f;
}

template <typename T, typename TT> inline void Int(T &n, TT &m) {
  Int(n);
  Int(m);
}
template <typename T, typename TT, typename TTT>
inline void Int(T &n, TT &m, TTT &l) {
  Int(n, m);
  Int(l);
}
double ind() {
  double x;
  scanf("%lf", &x);
  return x;
}

///*....Bitmask....*///
int set_1(int n, int pos) { return n = (n | (1 << pos)); }
int reset_0(int n, int pos) { return n = n & ~(1 << pos); }
bool check_bit(int n, int pos) { return n = n & (1 << pos); }

int dx[8] = {1, 0, -1, 0, -1, -1, 1, 1};
int dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};

///*....Constraints....*///
const int N = (int)2000 + 5;
const ll M = (ll)1e9 + 7;
const double pi = 2 * acos(0.0);
const double eps = 1e-9;

ll dp[N];

int n;
ll f(int sum) {
  if (sum == n)
    return 1ll;

  ll &ret = dp[sum];
  if (ret != -1)
    return ret;

  ll res = 0ll;
  for (int i = 3; i <= (n - sum); ++i) {
    int p = sum + i;
    if (p != n - 1 and p != n - 2) {
      ll k = f(p);
      res += k;
      if (res >= M)
        res %= M;
    }
  }
  return ret = res;
}

int main() {

  Int(n);
  memset(dp, -1, sizeof(dp));
  ll res = f(0);

  printf("%lld\\n", res);

  // printf("Case %d: ",++te);

  // cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" <<
  // '\\n';
  return 0;
}


Error: TLE

Fixed submission:


#include <bits/stdc++.h>
using namespace std;
/**
******************* Author:Bisnu sarkar ****************************
**/

#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")

#define fRead(x) freopen(x, "r", stdin)
#define fWrite(x) freopen(x, "w", stdout)
#define ull unsigned long long
#define ll long long
#define pii pair<int, int>
#define sit set<int>::iterator
#define vrit vector<int>::reverse iterator
#define ff first
#define ss second
#define endl '\\n';
#define sz(s) (int)s.size()
#define all(s) s.begin(), s.end()
#define IO ios_base::sync_with_stdio(false), cin.tie(NULL);
#define what_is(x) cerr << #x << " is " << x << endl;
///*....Debugger....*///
#define error(args...)                                                         \\
  {                                                                            \\
    string _s = #args;                                                         \\
    replace(_s.begin(), _s.end(), ',', ' ');                                   \\
    stringstream _ss(_s);                                                      \\
    istream_iterator<string> _it(_ss);                                         \\
    err(_it, args);                                                            \\
  }
void err(istream_iterator<string> it) { cout << endl; }
template <typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
  cerr << *it << " = " << a << ", ";
  err(++it, args...);
}
///*....Input....*///
template <typename T> inline void Int(T &n) {
  n = 0;
  int f = 1;
  register int ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-')
      f = -1;
  for (; isdigit(ch); ch = getchar())
    n = (n << 3) + (n << 1) + ch - '0';
  n = n * f;
}

template <typename T, typename TT> inline void Int(T &n, TT &m) {
  Int(n);
  Int(m);
}
template <typename T, typename TT, typename TTT>
inline void Int(T &n, TT &m, TTT &l) {
  Int(n, m);
  Int(l);
}
double ind() {
  double x;
  scanf("%lf", &x);
  return x;
}

///*....Bitmask....*///
int set_1(int n, int pos) { return n = (n | (1 << pos)); }
int reset_0(int n, int pos) { return n = n & ~(1 << pos); }
bool check_bit(int n, int pos) { return n = n & (1 << pos); }

int dx[8] = {1, 0, -1, 0, -1, -1, 1, 1};
int dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};

///*....Constraints....*///
const int N = (int)2000 + 5;
const ll M = (ll)1e9 + 7;
const double pi = 2 * acos(0.0);
const double eps = 1e-9;

ll dp[N][N];

int n;
ll f(int pos, int sum) {
  if (sum == n)
    return 1ll;

  ll &ret = dp[pos][sum];
  if (ret != -1)
    return ret;

  ll res = 0ll;
  for (int i = 3; i <= (n - sum); ++i) {
    int p = sum + i;
    if (p != n - 1 and p != n - 2) {
      ll k = f(pos + 1, p);
      res += k;
      if (res >= M)
        res %= M;
    }
  }
  return ret = res;
}

int main() {

  Int(n);
  memset(dp, -1, sizeof(dp));
  ll res = f(0, 0);

  printf("%lld\\n", res);

  // printf("Case %d: ",++te);

  // cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" <<
  // '\\n';
  return 0;
}