Problem p03395 (C++)

Buggy submission (status: Time Limit Exceeded):
// #pragma GCC optimize ("O3")
// #pragma GCC target ("tune=native")
// #pragma GCC target ("avx")
// #include <bits/stdc++.h>
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> P;
typedef pair<P, ll> PPI;
typedef pair<ll, P> PIP;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<P> vp;
#define PQ(T) priority_queue<T, vector<T>, greater<T>>
#define PQ2(T) priority_queue<T>
const double PI = 3.14159265358979323846;
const double EPS = 1e-12;
const ll INF = 1LL << 29;
const ll mod = 1e9 + 7;
#define REP(i, a, b) for (ll(i) = a; (i) < (ll)(b); ++(i))
#define rep(i, n) REP(i, 0, n)
#define rep1(i, n) REP(i, 1, n + 1)
#define repd(i, n, d) for (ll(i) = 0; (i) < (ll)(n); (i) += (d))
#define all(v) (v).begin(), (v).end()
#define pb(x) push_back(x)
#define mp(x, y) make_pair((x), (y))
#define mset(m, v) memset((m), (v), sizeof(m))
#define chmin(x, y) ((x) = min((x), (y)))
#define chmax(x, y) ((x) = max((x), (y)))
#define fst first
#define snd second
#define UNIQUE(x) (x).erase(unique(all(x)), (x).end())
#define DEBUG(x)                                                               \
  cerr << "line (" << __LINE__ << ")  " << #x << ": " << x << endl;
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  int n = v.size();
  rep(i, n) os << v[i] << (i == n - 1 ? "" : " ");
  return os;
}
#define INIT                                                                   \
  std::ios::sync_with_stdio(false);                                            \
  std::cin.tie(0);

#define N 55
ll n;
ll a[N], b[N], as[N];
bool f[N][N][N];
ll g[N][N];

int main() {
  cin >> n;
  rep(i, n) cin >> a[i];
  rep(i, n) cin >> b[i];
  rep(i, N) rep1(j, N - 1) rep(k, N) f[i][j][k] = i % j == k;
  rep(i, N) fill(g[i], g[i] + N, INF);
  rep(i, N) rep(k, N) rep(j, N) if (f[i][j][k]) {
    g[i][k] = j;
    break;
  }
  rep(j, N) rep(i, N) rep(k, N) chmin(g[i][k], max(g[i][j], g[j][k]));
  rep(i, n) as[i] = 1LL << a[i];
  ll res = 0;
  while (true) {
    bool flag = true;
    ll mx = -1;
    rep(i, n) {
      if (!(1 & (as[i] >> b[i])))
        flag = false;
      ll mx2 = INF;
      rep(j, N) {
        if (1 & (as[i] >> j))
          chmin(mx2, g[j][b[i]]);
      }
      chmax(mx, mx2);
    }
    if (flag)
      break;
    if (mx == INF) {
      res = -1;
      break;
    }
    rep(i, n) rep(j, N) if (1 & (as[i] >> j)) as[i] |= 1LL << (j % mx);
    res += 1LL << mx;
  }
  cout << res << endl;
  return 0;
}


Fixed submission:
// #pragma GCC optimize ("O3")
// #pragma GCC target ("tune=native")
// #pragma GCC target ("avx")
// #include <bits/stdc++.h>
#include <algorithm>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> P;
typedef pair<P, ll> PPI;
typedef pair<ll, P> PIP;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<P> vp;
#define PQ(T) priority_queue<T, vector<T>, greater<T>>
#define PQ2(T) priority_queue<T>
const double PI = 3.14159265358979323846;
const double EPS = 1e-12;
const ll INF = 1LL << 29;
const ll mod = 1e9 + 7;
#define REP(i, a, b) for (ll(i) = a; (i) < (ll)(b); ++(i))
#define rep(i, n) REP(i, 0, n)
#define rep1(i, n) REP(i, 1, n + 1)
#define repd(i, n, d) for (ll(i) = 0; (i) < (ll)(n); (i) += (d))
#define all(v) (v).begin(), (v).end()
#define pb(x) push_back(x)
#define mp(x, y) make_pair((x), (y))
#define mset(m, v) memset((m), (v), sizeof(m))
#define chmin(x, y) ((x) = min((x), (y)))
#define chmax(x, y) ((x) = max((x), (y)))
#define fst first
#define snd second
#define UNIQUE(x) (x).erase(unique(all(x)), (x).end())
#define DEBUG(x)                                                               \
  cerr << "line (" << __LINE__ << ")  " << #x << ": " << x << endl;
template <class T> ostream &operator<<(ostream &os, const vector<T> &v) {
  int n = v.size();
  rep(i, n) os << v[i] << (i == n - 1 ? "" : " ");
  return os;
}
#define INIT                                                                   \
  std::ios::sync_with_stdio(false);                                            \
  std::cin.tie(0);

#define N 55
ll n;
ll a[N], b[N], as[N];
bool f[N][N][N];
ll g[N][N];

int main() {
  cin >> n;
  rep(i, n) cin >> a[i];
  rep(i, n) cin >> b[i];
  rep(i, N) rep1(j, N - 1) rep(k, N) f[i][j][k] = i % j == k;
  rep(i, N) fill(g[i], g[i] + N, INF);
  rep(i, N) rep(k, N) rep(j, N) if (f[i][j][k]) {
    g[i][k] = j;
    break;
  }
  rep(i, N) g[i][i] = 0;
  rep(j, N) rep(i, N) rep(k, N) chmin(g[i][k], max(g[i][j], g[j][k]));
  rep(i, n) as[i] = 1LL << a[i];
  ll res = 0;
  while (true) {
    bool flag = true;
    ll mx = -1;
    rep(i, n) {
      if (!(1 & (as[i] >> b[i])))
        flag = false;
      ll mx2 = INF;
      rep(j, N) {
        if (1 & (as[i] >> j))
          chmin(mx2, g[j][b[i]]);
      }
      chmax(mx, mx2);
    }
    if (flag)
      break;
    if (mx == INF) {
      res = -1;
      break;
    }
    rep(i, n) rep(j, N) if (1 & (as[i] >> j)) as[i] |= 1LL << (j % mx);
    res += 1LL << mx;
  }
  cout << res << endl;
  return 0;
}