#include #include #include #include #include #include using namespace std; typedef long long unsigned lli; typedef unordered_map hash_map; typedef vector vi; typedef pair pii; typedef vector vpii; vpii FactorNumber(lli n) { vpii factors; lli m = 2; while (m * m <= n) { if (n % m == 0) { if (factors.empty()) factors.push_back(make_pair(m, 1)); else if (factors.back().first == m) factors.back().second++; else factors.push_back(make_pair(m, 1)); n /= m; } else ++m; } if (n > 1) { if (factors.empty()) factors.push_back(make_pair(n, 1)); else if (factors.back().first == n) factors.back().second++; else factors.push_back(make_pair(n, 1)); } return factors; } lli ComputeMaxMoves(lli a, hash_map& moves_map, vpii& factors) { auto it = moves_map.find(a); if (it != end(moves_map)) return (*it).second; lli max_moves = 0; for (int i = 0; i < factors.size(); ++i) { if (factors[i].second != 0) { lli n = a / factors[i].first; // requires incr of moves_so_far and decr of factors[i].second --factors[i].second; lli required_moves; if (n == 1) required_moves = a + 1; else required_moves = factors[i].first * ComputeMaxMoves(n, moves_map, factors) + 1; max_moves = max(max_moves, required_moves); ++factors[i].second; } } moves_map.insert(make_pair(a, max_moves)); return max_moves; } lli ComputeMaxMoves(lli a, hash_map& moves_map) { vpii factors = FactorNumber(a); lli max_moves = ComputeMaxMoves(a, moves_map, factors); return max_moves; } auto main() -> int { lli n; cin >> n; lli total_moves = 0; hash_map moves_map; moves_map.insert(make_pair(1, 1)); // it takes one move to eat one piece for (int i = 0; i < n; ++i) { lli a; cin >> a; total_moves += ComputeMaxMoves(a, moves_map); } printf("%llu", total_moves); }