#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn = 50 + 2;

int n, a[maxn], b[maxn], used[maxn];
ll Ans;

bool dp[maxn][maxn];
inline bool Check(int id) {
  memset(dp,0,sizeof(dp));
	dp[50][a[id]] = 1;
	for(int i = 50;i >= 1;i --) {
		for(int j = 0;j <= a[id];j ++) {
			if(!dp[i][j]) continue;
			dp[i - 1][j] = 1;
			if(used[i]) dp[i - 1][j % i] = 1;
		}
	}
	return dp[0][b[id]];
}

inline bool check(int x) {
	int flag = 1;
	used[x] = 0;
	if(x == 1) {
		int xxx = 1;
		xxx ++;
	}
	for(int i = 1;i <= n;i ++) {
		flag &= Check(i);
	}
	used[x] = 1;
	return flag;
}

int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);
	for(int i = 1;i <= n;i ++) scanf("%d", &b[i]);
	for(int i = 1;i <= n;i ++) {
		if(a[i] != b[i] && b[i] * 2 >= a[i]) {
			puts("-1");
			return 0;
		}
	}
	Ans = 0;
	for(int i = 0;i <= 50;i ++) used[i] = 1;
	for(int i = 50;i >= 0;i --) {
    if(!check(i)) Ans += 1LL << i;
		else used[i] = 0;
	}
	printf("%lld\n", Ans);
	return 0;
}
