#include<bits/stdc++.h>
#include <functional>
using namespace std;
using ll=long long;
const ll inf=1145141919810;
ll n;
vector<ll>a(10);
vector<vector<ll>>q;
ll ans=inf;
const ll N = 1000; // 质数筛选最大范围
vector<ll> primes; // 存储筛出的所有质数
vector<bool> is_prime(N + 1, true); // 标记是否为质数,初始默认是质数
// 欧拉筛(线性筛)预处理质数
void sieve() {
is_prime[0] = is_prime[1] = false; // 0和1不是质数
for (ll i = 2; i <= N; ++i) { // 遍历2~MAXN所有数
if (is_prime[i]) {
primes.push_back(i); // 未被标记则是质数,加入数组
}
for (ll p : primes) { // 用已筛质数标记合数
if (i * p > N) break; // 超出范围则终止
is_prime[i * p] = false; // 标记i*p为合数
if (i % p == 0) break; // 保证仅被最小质因子标记
}
}
}
bool B[N];
void dfs(ll x,ll v){
for(auto t:q[x]){
if(B[t]==false){
if(x<n-1){
B[t]=true;
dfs(x+1,v+t);
B[t]=false;
}else{
ans=min(ans,v+t);
}
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
sieve();
cin>>n;
for(ll i=0;i<n;i++){
cin>>a[i];
}
for(ll i=0;i<n;i++){
vector<ll>t;
for(ll j=1;j*j<=a[i];j++){
if(a[i]%j==0){
if(is_prime[j]==true)t.emplace_back(j);
if(is_prime[a[i]/j]==true){
t.emplace_back(a[i]/j);
}
}
}
q.emplace_back(t);
}
dfs(0,0);
if(ans==inf)cout<<-1;
else cout<<ans;
return 0;
}