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: Accepted)

#include <bits/stdc++.h>

using namespace std;

#define DBG cerr << '!' << endl;
#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define rep(i,s,g) for(ll (i) = (s);(i) < (g);++i)
#define rrep(i,s,g) for(ll (i) = (s);i >= (g);--(i))
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {for(int W = 0;W < (n);W++)cerr << v[W] << ' ';cerr << endl << endl;}
#define SHOW2d(v,i,j) {for(int aaa = 0;aaa < i;aaa++){for(int bbb = 0;bbb < j;bbb++)cerr << v[aaa][bbb] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(10)
#define INF 100000000
#define MOD 1000000007

typedef long long ll;
typedef pair<ll,ll> P;

int mp[51][51];
bool ok[55];

void fum(ll num){
	REP(i,51)REP(j,51)mp[i][j] = INF;
	REP(i,51)mp[i][i] = 0;
	REP(i,51){
		if(num & (1LL<<i)){
			for(int j = 1;j < 51;j++){
			//	if(num == 32)cout << num << ' ' << j << ' ' << (j%i) << endl;
				mp[j][j%i] = 1;
			}
		}
	}
	REP(k,51)REP(i,51)REP(j,51){
		mp[i][j] = min(mp[i][j],mp[i][k] + mp[k][j]);
	}
}

int main()
{
	ll ans = 0;
	
	for(int i = 50;i > 0;i--)ans |= (1LL << i);
	
	ll n;cin >> n;
	
	vector<ll> A(n);
	REP(i,n)cin >> A[i];
	vector<ll> B(n);
	REP(i,n)cin >> B[i];
	
	fum(ans);
	REP(i,n){
		if(mp[A[i]][B[i]] != INF){
			ok[i] = true;
		}
	}
	
	REP(i,n){
		if(!ok[i]){
			cout << -1 << endl;
			return 0;
		}
	}
		
	for(ll i = 50;i > 0;i--){
		ll tmp = ans & ~(1LL << i);
		if(ans == tmp)continue;
		fum(tmp);
		bool flag = true;
		REP(i,n){
			if(mp[A[i]][B[i]] == INF)flag = false;
		}
		if(flag)ans = tmp;
	}
	
	cout << ans << endl;
		
	
	return 0;
}