Problem p02669 (C++)

Buggy submission (status: Time Limit Exceeded):
#pragma GCC target("avx2,avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
using i128 = __int128_t;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
constexpr char ln = '\n';
template <class T1, class T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
inline int topbit(int x) { return x == 0 ? -1 : 31 - __builtin_clz(x); }
inline int topbit(long long x) { return x == 0 ? -1 : 63 - __builtin_clzll(x); }
inline int botbit(int x) { return x == 0 ? 32 : __builtin_ctz(x); }
inline int botbit(long long x) { return x == 0 ? 64 : __builtin_ctzll(x); }
inline int popcount(int x) { return __builtin_popcount(x); }
inline int popcount(long long x) { return __builtin_popcountll(x); }
inline void print() { cout << "\n"; }
template <class T> inline void print(const vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end(); ++itr)
    cout << *itr << " ";
  print();
}
template <class T, class... Args>
inline void print(const T &x, const Args &...args) {
  cout << x << " ";
  print(args...);
}
#ifdef MINATO_LOCAL
#define dump(x) cerr << __LINE__ << " : " << #x << " = " << (x) << endl;
inline void debug() { cerr << endl; }
template <class T> inline void debug(const vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end(); ++itr)
    cerr << *itr << " ";
  debug();
}
template <class T, class... Args>
inline void debug(const T &x, const Args &...args) {
  cerr << x << " ";
  debug(args...);
}
#else
#define dump(x) void(0)
inline void debug() {}
template <class T> inline void debug(const vector<T> &v) {}
template <class T, class... Args>
inline void debug(const T &x, const Args &...args) {}
#endif
struct Fast_ios {
  Fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ll C[4];
ll arr[3] = {2, 3, 5};
const ll INF = 1e18;
void solve() {
  ll N;
  cin >> N;
  rep(i, 4) cin >> C[i];

  unordered_map<ll, ll> dic;
  auto dfs = [&](auto &&self, ll n) -> ll {
    if (dic.count(n))
      return dic[n];
    if (n == 1)
      return dic[n] = C[3];
    dic[n] = INF;
    if (C[3] <= INF / n)
      dic[n] = C[3] * n;
    rep(i, 3) {
      ll m1 = n / arr[i];
      ll m2 = m1 + 1;
      ll l = m1 * arr[i];
      ll r = m2 * arr[i];
      if (m1 and m1 < n) {
        chmin(dic[n], self(self, m1) + (n - l) * C[3] + C[i]);
      }
      if (m2 < n) {
        chmin(dic[n], self(self, m2) + (r - n) * C[3] + C[i]);
      }
    }

    return dic[n];
  };

  cout << dfs(dfs, N) << ln;
}

int main() {

  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  freopen("error.txt", "w", stderr);

  int Q;
  cin >> Q;
  while (Q--) {
    solve();
  }
}

Fixed submission:
#pragma GCC target("avx2,avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
using i128 = __int128_t;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<long long, long long>;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
constexpr char ln = '\n';
template <class T1, class T2> inline bool chmax(T1 &a, T2 b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T1, class T2> inline bool chmin(T1 &a, T2 b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
inline int topbit(int x) { return x == 0 ? -1 : 31 - __builtin_clz(x); }
inline int topbit(long long x) { return x == 0 ? -1 : 63 - __builtin_clzll(x); }
inline int botbit(int x) { return x == 0 ? 32 : __builtin_ctz(x); }
inline int botbit(long long x) { return x == 0 ? 64 : __builtin_ctzll(x); }
inline int popcount(int x) { return __builtin_popcount(x); }
inline int popcount(long long x) { return __builtin_popcountll(x); }
inline void print() { cout << "\n"; }
template <class T> inline void print(const vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end(); ++itr)
    cout << *itr << " ";
  print();
}
template <class T, class... Args>
inline void print(const T &x, const Args &...args) {
  cout << x << " ";
  print(args...);
}
#ifdef MINATO_LOCAL
#define dump(x) cerr << __LINE__ << " : " << #x << " = " << (x) << endl;
inline void debug() { cerr << endl; }
template <class T> inline void debug(const vector<T> &v) {
  for (auto itr = v.begin(); itr != v.end(); ++itr)
    cerr << *itr << " ";
  debug();
}
template <class T, class... Args>
inline void debug(const T &x, const Args &...args) {
  cerr << x << " ";
  debug(args...);
}
#else
#define dump(x) void(0)
inline void debug() {}
template <class T> inline void debug(const vector<T> &v) {}
template <class T, class... Args>
inline void debug(const T &x, const Args &...args) {}
#endif
struct Fast_ios {
  Fast_ios() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ll C[4];
ll arr[3] = {2, 3, 5};
const ll INF = 1e18;
void solve() {
  ll N;
  cin >> N;
  rep(i, 4) cin >> C[i];

  unordered_map<ll, ll> dic;
  auto dfs = [&](auto &&self, ll n) -> ll {
    if (dic.count(n))
      return dic[n];
    if (n == 1)
      return dic[n] = C[3];
    dic[n] = INF;
    if (C[3] <= INF / n)
      dic[n] = C[3] * n;
    rep(i, 3) {
      ll m1 = n / arr[i];
      ll m2 = m1 + 1;
      ll l = m1 * arr[i];
      ll r = m2 * arr[i];
      if (m1 and m1 < n) {
        chmin(dic[n], self(self, m1) + (n - l) * C[3] + C[i]);
      }
      if (m2 < n) {
        chmin(dic[n], self(self, m2) + (r - n) * C[3] + C[i]);
      }
    }

    return dic[n];
  };

  cout << dfs(dfs, N) << ln;
}

int main() {
  int Q;
  cin >> Q;
  while (Q--) {
    solve();
  }
}