#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
// ----- sieve up to 1e6 -----
vector<int> small_primes;
void build_sieve() {
const int LIM = 1000000;
vector<bool> is(LIM + 1, true);
is[0] = is[1] = false;
for (int i = 2; i <= LIM; ++i) if (is[i]) {
small_primes.push_back(i);
if (1LL * i * i <= LIM)
for (long long j = 1LL * i * i; j <= LIM; j += i) is[(int)j] = false;
}
}
vector<pair<long long,int>> factorize(long long n) {
vector<pair<long long,int>> f;
long long x = n;
for (int p : small_primes) {
if (1LL * p * p > x) break;
if (x % p == 0) {
int c = 0;
while (x % p == 0) { x /= p; ++c; }
f.push_back({p, c});
}
}
if (x > 1) f.push_back({x, 1});
return f;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
build_sieve();
int T=1;
while (T--) {
int N;
cin >> N;
vector<long long> a(N);
for (int i = 0; i < N; ++i) cin >> a[i];
// factorize all and count composite numbers
vector<vector<pair<long long,int>>> F(N);
int composite_cnt = 0;
for (int i = 0; i < N; ++i) {
F[i] = factorize(a[i]);
bool isPrime = (F[i].size() == 1 && F[i][0].second == 1 && F[i][0].first == a[i]);
if (!isPrime) composite_cnt++;
}
// collect distinct primes
unordered_map<long long,int> idx;
vector<long long> primes;
primes.reserve(64);
for (int i = 0; i < N; ++i)
for (auto &pe : F[i]) if (!idx.count(pe.first)) {
idx[pe.first] = (int)primes.size();
primes.push_back(pe.first);
}
int P = (int)primes.size();
// exponent table exp[p][i]
vector<vector<int>> expP(P, vector<int>(N, 0));
for (int i = 0; i < N; ++i)
for (auto &pe : F[i]) expP[idx[pe.first]][i] = pe.second;
int FULL = 1 << N;
// precompute max exponent per prime for every subset
vector<vector<int>> maxExp(P, vector<int>(FULL, 0));
for (int j = 0; j < P; ++j)
for (int mask = 1; mask < FULL; ++mask) {
int lsb = mask & -mask;
int i = __builtin_ctz(lsb);
maxExp[j][mask] = max(maxExp[j][mask ^ lsb], expP[j][i]);
}
// cost[mask] = leaves needed if mask is a chain
vector<int> cost(FULL, 0);
for (int mask = 1; mask < FULL; ++mask) {
long long s = 0;
for (int j = 0; j < P; ++j) s += maxExp[j][mask];
cost[mask] = (int)s;
}
// pairwise divisibility
vector<vector<char>> divs(N, vector<char>(N, 0));
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
if (i != j) divs[i][j] = (a[j] % a[i] == 0);
// mark chains
vector<char> isChain(FULL, 0);
isChain[0] = 1;
for (int mask = 1; mask < FULL; ++mask) {
bool ok = true;
for (int i = 0; i < N && ok; ++i) if (mask & (1 << i))
for (int j = i + 1; j < N; ++j) if (mask & (1 << j))
if (!(divs[i][j] || divs[j][i])) { ok = false; break; }
isChain[mask] = ok;
}
// DP: partition into chains minimizing total leaves
const int INF = 1e9;
vector<int> dp(FULL, INF);
dp[0] = 0;
for (int mask = 1; mask < FULL; ++mask) {
int sub = mask;
while (sub) {
if (isChain[sub]) dp[mask] = min(dp[mask], dp[mask ^ sub] + cost[sub]);
sub = (sub - 1) & mask;
}
}
int leaves = dp[FULL - 1];
// extra root node only if the whole set is NOT a chain
int extra_root = isChain[FULL - 1] ? 0 : 1;
long long ans = leaves + composite_cnt + extra_root;
cout << ans << '\n';
}
return 0;
}