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 LuaJIT (2.0.4) (judge verdict: Runtime Error)

local mmi, mma = math.min, math.max
local mfl, mce = math.floor, math.ceil
local n = io.read("*n")
local a = {}
local b = {}
local kval = {}
for i = 1, n do
  a[i] = {}
  local z = io.read("*n")
  a[i][z] = true
  kval[i] = 100
end
for i = 1, n do
  b[i] = io.read("*n")
end
local valid = true
for i = 1, n do
  local at = next(a[i])
  local z = at - b[i]
  local min = b[i] + 1
  if 0 < z and z < min then
    valid = false
  end
  for j = min, z do
    if z % j == 0 then
      kval[i] = j
      break
    end
  end
end
if not valid then
  print(-1)
  os.exit()
end
local function flush()
  for i = n, 1, -1 do
    local found = false
    for av, _u in pairs(a[i]) do
      if b[i] == av then
        found = true
        break
      end
    end
    if found then
      table.remove(a, i)
      table.remove(b, i)
      table.remove(kval, i)
    end
  end
  n = #a
end
local ret = {}
while true do
  flush()
  if n == 0 then
    break
  end
  local maxval = kval[1]
  for i = 2, n do
    maxval = mma(maxval, kval[i])
  end
  assert(maxval < 100)
  table.insert(ret, maxval)
  for i = 1, n do
    local add = {}
    for av, _u in pairs(a[i]) do
      local z = av % maxval
      if b[i] <= z then
        table.insert(add, z)
      end
    end
    for j = 1, #add do
      local v = add[j]
      a[i][v] = true
      local z = v - b[i]
      local min = b[i] + 1
      for s = min, z do
        if z % s == 0 then
          kval[i] = mmi(kval[i], s)
          break
        end
      end
    end
  end
end
local ans = 0LL
for i = 1, #ret do
  local v = ret[i]
  local z = 1LL
  for j = 1, v do
    z = z * 2LL
  end
  ans = ans + z
end
local str = tostring(ans):gsub("LL", "")
print(str)