Problem:
Score : 700 points

Problem Statement

Aoki is playing with a sequence of numbers a_{1}, a_{2}, ..., a_{N}. Every second, he performs the following operation :

Choose a positive integer k. For each element of the sequence v, Aoki may choose to replace v with its remainder when divided by k, or do nothing with v. The cost of this operation is 2^{k} (regardless of how many elements he changes).

Aoki wants to turn the sequence into b_{1}, b_{2}, ..., b_{N} (the order of the elements is important). Determine if it is possible for Aoki to perform this task and if yes, find the minimum cost required.

Constraints

1 \leq N \leq 50

0 \leq a_{i}, b_{i} \leq 50

All values in the input are integers.

Input

Input is given from Standard Input in the following format:

N
a_{1} a_{2} ... a_{N}
b_{1} b_{2} ... b_{N}

Output

Print the minimum cost required to turn the original sequence into b_{1}, b_{2}, ..., b_{N}. If the task is impossible, output -1 instead.

Sample Input 1

3
19 10 14
0 3 4

Sample Output 1

160

Here's a possible sequence of operations :

Choose k = 7. Replace 19 with 5, 10 with 3 and do nothing to 14. The sequence is now 5, 3, 14.

Choose k = 5. Replace 5 with 0, do nothing to 3 and replace 14 with 4. The sequence is now 0, 3, 4.

The total cost is 2^{7} + 2^{5} = 160.

Sample Input 2

3
19 15 14
0 0 0

Sample Output 2

2

Aoki can just choose k = 1 and turn everything into 0. The cost is 2^{1} = 2.

Sample Input 3

2
8 13
5 13

Sample Output 3

-1

The task is impossible because we can never turn 8 into 5 using the given operation.

Sample Input 4

4
2 0 1 8
2 0 1 8

Sample Output 4

0

Aoki doesn't need to do anything here. The cost is 0.

Sample Input 5

1
50
13

Sample Output 5

137438953472

Beware of overflow issues.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
  
using namespace std;
  
#define rep(i,n) REP(i,0,n)
#define REP(i,s,e) for(int i=(s); i<(int)(e); i++)
#define repr(i, n) REPR(i, n, 0)
#define REPR(i, s, e) for(int i=(int)(s-1); i>=(int)(e); i--)
#define pb push_back
#define all(r) r.begin(),r.end()
#define rall(r) r.rbegin(),r.rend()
#define fi first
#define se second
  
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
 
const int INF = 1e9;
const ll MOD = 1e9 + 7;
double EPS = 1e-8;


#define DEBUG_MODE
#ifdef DEBUG_MODE
#define dump(x) cout << #x << " : " << x << endl
#define LINE cout << "line : " << __LINE__ << endl
#define dumpV(v) cout << #v << " : ["; for(auto& t : v) cout << t << ", "; cout<<"]" << endl
#define STOP assert(false)
#else
#define dump(x) ;
#define LINE     ;
#define dumpV(v);
#define STOP     ;
#endif
#define mp make_pair

namespace std{
  template<class S,class T>
  ostream &operator <<(ostream& out,const pair<S,T>& a){
    out<<'('<<a.fi<<", "<<a.se<<')';
    return out;
  }
}


// ll bt[51][51];

set<ll> st[51][51];

int main(){
    rep(i, 51) REP(j, 1, i+1) {
        // bt[i][i%j] |= 1LL<<j;
        st[i][i%j].insert(1LL<<j);
    }
    // ll sum = 0LL;
    // rep(i, 51) {
    //     rep(j, 51) {
    //         sum += st[i][j].size();
    //     }
    // }
    // cout << sum << endl;
    // return 0;
    // rep(i, 51) rep(j, 51) if(bt[i][j] != 0) st[i][j].insert(bt[i][j]);
    rep(k, 51) {
        REP(i, k, 51) {
            rep(j, i+1) {
                // i -> k -> j
                for(auto x : st[i][k]) for(auto y : st[k][j]) {
                    st[i][j].insert(x | y);
                }
            }
        }
    }
    // return 0;
    // rep(i, 51) {
    //     rep(j, 51) {
    //         printf("%3d,", st[i][j].size());
    //     }
    //     printf("\n");
    // }
    int n;
    cin >> n;
    vi a(n);
    vi b(n);
    rep(i, n) cin >> a[i];
    rep(i, n) cin >> b[i];
    if(a == b) {
        cout << 0 << endl;
        return 0;
    }
    rep(i, n) {
        if(st[a[i]][b[i]].size() == 0) {
            cout << -1 << endl;
            return 0;
        }
    }
    // set<ll> ss;
    // // rep(i, 51) rep(j, 51) {
    // //     for(auto x : st[i][j]) {
    // //         ss.insert(x);
    // //     }
    // // }
    // // cout << ss.size() << endl;
    // rep(i, n) {
    //     for(auto x : st[a[i]][b[i]]) {
    //         ss.insert(x);
    //     }
    // }
    // ull ans = ULLONG_MAX;
    // for(const auto& x : ss) {
    //     ll f = x;
    //     rep(i, n) {

    //     }
    // }
    // rep(i, n) {
    //     cout << a[i] << " " << b[i] << endl;
    //     for(auto& x : st[a[i]][b[i]]) {
    //         cout << " " << x << endl;
    //     }
    // }
    // rep(i, n) {
    //     cout << a[i] << " " << b[i] << endl;
    //     for(auto& x: st[a[i]][b[i]]) {
    //         cout << " " << x << endl;
    //     }
    // }
    ll ans = (1LL << 51) - 1;
    repr(k, 51) {
        ll tmp = ans - (1LL<<k);
        bool f = true;
        rep(i, n) {
            bool ff = false;
            for(auto& x : st[a[i]][b[i]]) {
                if((x | tmp) == tmp) ff = true;
            }
            f &= ff;
        }
        if(f) ans = tmp;
    }
    cout << ans << endl;
    // for(auto& x: st[4][0]) {
    //     cout << "  " << x << endl;
    // }
    return 0;
}