#include #include #include #include #include using namespace std; long long findMoves(int val, vector & moves) { if (moves[val] != 0) { return moves[val]; } long long maxMoves = val + 1; int root = sqrt(val); for (int i = 2; i <= root; ++i) { if (val % i != 0) { continue; } long x = i, y = val / i; long long cMoves = (1 + x * ((moves[y] != 0) ? moves[y] : findMoves(y, moves))); maxMoves = (maxMoves > cMoves) ? maxMoves : cMoves; y = i, x = val / i; cMoves = (1 + x * ((moves[y] != 0) ? moves[y] : findMoves(y, moves))); maxMoves = (maxMoves > cMoves) ? maxMoves : cMoves; } moves[val] = maxMoves; return maxMoves; } long longestSequence(vector & a) { // Return the length of the longest possible sequence of moves. long long int totalMoves = 0; int longestStick = 0; for (auto i : a) { longestStick = (longestStick > i) ? longestStick : i; } vector moves(longestStick + 1); moves[1] = 1; moves[2] = 3; for (auto i : a) { totalMoves += (moves[i] != 0) ? moves[i] : findMoves(i, moves); } return totalMoves; } int main() { int n; cin >> n; vector a(n); for(int a_i = 0; a_i < n; a_i++){ cin >> a[a_i]; } long result = longestSequence(a); cout << result << endl; return 0; }