#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;
}