#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
using namespace std;

long long int pow2(int n){
	long long int ret = 1;
	for(int i = 0; i < n; i++){
		ret *= 2;
	}
	return ret;
}

int main() {
	
	int a[100], b[100];
	
	int N;
	cin >> N;
	
	for(int i = 0; i < N; i++){
		cin >> a[i];
	}
	
	for(int i = 0; i < N; i++){
		cin >> b[i];
	}
	
	long long int ans = 0;
	
	for(int i = 0; i < N; i++){
		bool DP[100] = {};
		DP[a[i]] = true;
		for(int j = 50; j >= 1; j--){
			for(int k = 0; k <= 50; k++){
				DP[k % j] = (DP[k % j] || DP[k]);
			}
		}
		if(!DP[b[i]]){
			cout << "-1" << endl;
			return 0;
		}
	}
	
	vector<int> v;
	
	for(int loop = 50; loop >= 1; loop--){
		bool flag = false;
		for(int i = 0; i < N; i++){
			bool DP[100] = {};
			DP[a[i]] = true;
			for(int j = 0; j < v.size(); j++){
				for(int k = 0; k <= 50; k++){
					DP[k % v[j]] = (DP[k % v[j]] || DP[k]);
				}
			}
			for(int j = loop - 1; j >= 1; j--){
				for(int k = 0; k <= 50; k++){
					DP[k % j] = (DP[k % j] || DP[k]);
				}
			}
			if(!DP[b[i]]){
				flag = true;
				v.push_back(loop);
			}
		}
		if(flag){
			ans += pow2(loop);
		}
	}
	
	cout << ans << endl;
	
	return 0;
}

