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>
#define rep(i, a, n) for(int i = a; i < n; i++)
#define REP(i, n) rep(i, 0, n)
#define repb(i, a, b) for(int i = a; i >= b; i--)
#define all(a) a.begin(), a.end()
#define int long long
#define chmax(x, y) x = max(x, y)
#define chmin(x, y) x = min(x, y)
using namespace std;
typedef pair<int, int> P;
const int mod = 1000000007;
const int INF = 1e18;

signed main(){
    int cost[52][52];
    rep(i, 0, 51) rep(j, 0, 51) cost[i][j] = INF;
    rep(i, 0, 51) cost[i][i] = 0;
	rep(i, 0, 51){
		// cout << i << ": ";
		rep(j, 0, i){
			rep(k, 1, 51){
				if(i % k == j){
                    // printf("%2lld ", k);
                    cost[i][j] = 1LL << k;
					break;
				}
            }
		}
		// cout << endl;
    }
    // cout << cost[20][1] << endl;
    rep(i, 0, 51){
        repb(j, i - 1, 0){
            if(cost[i][j] == -1) continue;
            rep(k, j + 1, i){
                if(cost[i][k] == INF || cost[k][j] == INF) continue;
                int tmp = cost[i][k] | cost[k][j];
                if(tmp < cost[i][j]){
                    // cout << i << " " << k << " " << j << endl;
                    cost[i][j] = tmp;
                }
            }
        }
    }
    // cout << cost[20][1] << endl;
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    rep(i, 0, n) cin >> a[i];
    rep(i, 0, n) cin >> b[i];
    int ans = 0;
    rep(i, 0, n){
        if(cost[a[i]][b[i]] == INF){
            cout << -1 << endl;
            return 0;
        }
    }
    while(1){
        int now = 0;
        rep(i, 0, n){
            now |= cost[a[i]][b[i]];
        }
        int high = -1;
        repb(i, 50, 1){
            if(now & (1LL << i)){
                high = i;
                break;
            }
        }
        if(high == -1) break;
        ans |= 1LL << high;
        rep(i, 0, n){
            int tmp = cost[a[i]][b[i]];
            int tmp2 = cost[a[i] % high][b[i]];
            if(tmp2 == INF) continue;
            rep(j, 0, 51){
                if(ans & (1LL << j)){
                    if(tmp & (1LL << j)) tmp ^= (1LL << j);
                    if(tmp2 & (1LL << j)) tmp2 ^= (1LL << j);
                }
            }
            if(tmp >= tmp2){
                a[i] %= high;
            }
        }
        rep(i, 0, n){
            if(cost[a[i]][b[i]] & (1LL << high))cost[a[i]][b[i]] ^= (1LL << high);
        }
        // cout << high << " " << ans << endl;
        // for(int ii = 0; ii < a.size(); ii++){
        //     if(ii) cout << ' ';
        //     cout << a[ii];
        // }
        // cout << endl;        
    }
    cout << ans << endl;
}