#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Edge {
int u, v, weight;
bool operator<(const Edge& other) const {
return weight < other.weight;
}
};
class DisjointSet {
public:
vector<int> parent;
vector<int> size;
DisjointSet(int N) {
parent.resize(N);
size.resize(N);
for (int i = 0; i < N; ++i) {
parent[i] = i;
size[i] = 1;
}
}
int find_set(int v) {
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
void union_set(int a, int b) {
a = find_set(a);
b = find_set(b);
if (a != b) {
if (size[a] < size[b])
swap(a, b);
parent[b] = a;
size[a] += size[b];
}
}
bool connected(int v1, int v2) {
return find_set(v1) == find_set(v2);
}
};
int main() {
int card_num;
vector<vector<int>> adj_matrix;
vector<Edge> edges;
vector<Edge> mst_edges;
long long total_cost = 0;
cin >> card_num;
vector<int> cards(card_num);
for (int &c : cards) {
cin >> c;
cout << c << endl;
if (c < 1){
cout << c << endl;
return 0;
}
}
sort(cards.begin(), cards.end());
cards.erase(unique(cards.begin(), cards.end()), cards.end());
card_num = cards.size();
adj_matrix.assign(card_num, vector<int>(card_num, 0));
DisjointSet linked_cards(cards.size());
for (int i = 0; i < card_num; ++i) {
for (int j = i + 1; j < card_num; ++j) {
int weight = cards[j] % cards[i];
adj_matrix[i][j] = weight;
adj_matrix[j][i] = weight;
}
}
for (int i = 0; i < card_num; ++i) {
for (int j = i + 1; j < card_num; ++j) {
edges.push_back({i, j, adj_matrix[i][j]});
}
}
sort(edges.begin(), edges.end());
for (const Edge& edge : edges) {
if (!linked_cards.connected(edge.u, edge.v)) {
linked_cards.union_set(edge.u, edge.v);
total_cost += edge.weight;
mst_edges.push_back(edge);
if (mst_edges.size() == card_num - 1) {
break;
}
}
}
cout << "MST Total: " << total_cost << endl;
}