#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
vector<int> get_primes(int x) {
vector<int> primes;
for (int i = 2; i * i <= x; ++i) {
if (x % i == 0) {
primes.push_back(i);
while (x % i == 0) x /= i;
}
}
if (x > 1) primes.push_back(x);
return primes;
}
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<vector<int>> primes_list(n);
vector<int> all_primes;
for (int i = 0; i < n; ++i) {
primes_list[i] = get_primes(a[i]);
for (int p : primes_list[i]) {
all_primes.push_back(p);
}
}
sort(all_primes.begin(), all_primes.end());
all_primes.erase(unique(all_primes.begin(), all_primes.end()), all_primes.end());
int m = all_primes.size();
vector<vector<int>> dp(m + 1, vector<int>(1 << n, INT_MAX));
dp[0][0] = 0;
for (int i = 0; i < m; ++i) {
int p = all_primes[i];
vector<int> bits;
for (int j = 0; j < n; ++j) {
for (int prime : primes_list[j]) {
if (prime == p) {
bits.push_back(j);
break;
}
}
}
for (int mask = 0; mask < (1 << n); ++mask) {
if (dp[i][mask] == INT_MAX) continue;
dp[i + 1][mask] = min(dp[i + 1][mask], dp[i][mask]);
for (int j : bits) {
if (!(mask & (1 << j))) {
int new_mask = mask | (1 << j);
dp[i + 1][new_mask] = min(dp[i + 1][new_mask], dp[i][mask] + p);
}
}
}
}
int answer = dp[m][(1 << n) - 1];
cout << (answer == INT_MAX ? -1 : answer) << endl;
return 0;
}