// 思路:将每个数都取出一个不同的因子,依次相加,在对比选出最小的,
// 例如第一个数有a, b因子,第二个数有a,c,d因子,那么对比a+c,a+d,b+a,b+c,b+d,得到最小的。
#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <malloc.h>
int n; // 全局变量,所有函数随便用
int min = INT_MAX; // 最大int数,用来变小的
int isPrime(int i) {
for (int j = 2; j <= sqrt(i); j++) {
if (i % j == 0) {
return 0;
}
}
return 1;
}
void kotori(int* a, int* b, int index, int sum) {
if (index == n) {
// 多种情况比较,选出最小的,如果有因子相同的情况就到不了最后一步
if (min > sum) {
min = sum;
}
return;
}
for (int i = 2; i <= a[index]; i++) {
if (a[index] % i == 0 && isPrime(i)) {
// 选出a[index]的因子
int j = 0;
for (; j < index; j++) {
if (i == b[j]) {
break;
}
} // 和以往进来的因子比较,不是相同的
if (j == index) {
b[index] = i; // 不同的就可以进入b数组
kotori(a, b, index + 1, sum + i);
b[index] = 0;
}
}
}
}
int main() {
scanf("%d", &n);
int* a = (int*)malloc(sizeof(int) * n); // 装输入数
int* b = (int*)malloc(sizeof(int) * n); // 装每个数出的一个因子
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
kotori(a, b, 0, 0);
if (min == INT_MAX) {
printf("-1");
} else {
printf("%d", min);
}
return 0;
}