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: Time Limit Exceeded)

#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
#define int long long
int MOD = 1000000007;
signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);
	int N;
	cin >> N;
	vector<set<int> > A(N);
	vector<int> B(N);
	int res = 0;
	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		A[i].insert(a);
	}
	for (int i = 0; i < N; i++) {
		cin >> B[i];
	}
	bool f;
	set<int> st;
	int ii;
	int c;
	int mx = -1;
	vector<int> ok(N, 0);
	int okc = 0;
	for (int i = 0; i < N; i++) {
		if ((*A[i].begin()) == B[i]) {
			ok[i] = 1;
		}
		if ((*A[i].begin()) < B[i] * 2 && (*A[i].begin()) != B[i]) {
			cout << -1 << endl;
			return 0;
		}
	}
	while (true) {
		bool ff = false;
		for (int i = 0; i < N; i++) {
			if (ok[i] == 0) {
				ff = true;
				break;
			}
		}
		if (!ff) {
			break;
		}
		mx = -1;
		for (int i = 0; i < N; i++) {
			if (ok[i] == 0) {
				int mn = 100000;
				for (auto j : A[i]) {
					for (int k = 1; k <= 50; k++) {
						if ((j % k) > 2 * B[i] || (j % k) == B[i]) {
							mn = min(mn, k);
							break;
						}
					}
				}
				//cerr << i << " mn= " << mn << endl;
				mx = max(mx, mn);
			}
		}
		for (int i = 0; i < N; i++) {
			if (ok[i] == 0) {
				set<int> st = A[i];
				for (int j : st) {
					//cerr << i << "  " << j << endl;
					if ((j % mx) > 2 * B[i] || (j % mx) == B[i]) {
						A[i].insert(j % mx);
						if ((j % mx) == B[i]) {
							ok[i] = 1;
							break;
						}
					}
				}
			}
		}
		res +=( (int)1 << mx);
	}
	cout << res << endl;
}