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 y1 y114514
#define pb push_back
#define mkp make_pair
#define fi first
#define se second
#define pii pair<int, int>
#define M 1000000007
#define all(a) a.begin(), a.end()
typedef long long ll;

int n;
int a[50], b[50];
vector<ll> f[51][51];

void dfs(int s, int cur, int t, ll co){
	if(t > 0){
		if(cur) dfs(s, cur % t, cur % t - 1, co | 1LL << t);
		dfs(s, cur, t - 1, co);
	}else f[s][cur].pb(co);
}

int main(){
	scanf("%d", &n);
	for(int i = 0; i < n; ++i) scanf("%d", a + i);
	for(int i = 0; i < n; ++i) scanf("%d", b + i);
	f[0][0].pb(0);
	f[1][0].pb(2);
	f[1][1].pb(0);
	for(int i = 2; i <= 50; ++i)
		dfs(i, i, i - 1, 0);
	
	for(int i = 0; i < n; ++i)
		if(f[a[i]][b[i]].size() == 0){
			puts("-1");
			return 0;
		}
	
	ll now = 0;
	for(int k = 49; k >= 1; --k){
		bool flag = 1;
		for(int i = 0; i < n && flag; ++i){
			bool tmp = 0;
			for(ll v : f[a[i]][b[i]])
				if(~v >> k & 1) { tmp = 1; break; }
			flag &= tmp;
		}
		if(!flag) now |= 1LL << k;
		else{
			for(int i = 0; i < n; ++i){
				vector<ll> g;
				for(ll v : f[a[i]][b[i]])
					if(~v >> k & 1) g.pb(v);
				f[a[i]][b[i]] = g;
			}
		}
	}
	printf("%lld\n", now);
	
	
#ifndef ONLINE_JUDGE
	system("pause");
#endif
	return 0;
}