#include #include #include #include #include #include #include long mostdiva(long max, int x){ do { x--; } while((x > 1) && (max % x != 0)); return x; } long recurvise(long x, int testdiv){ long md = mostdiva(x ,testdiv); // printf("md >> %ld, x: %ld\n",md,x); if(md == x){ // printf("md == x\n"); return 1 + x; } else if( md > 1){ // printf("rec >> %ld\n",x / md); return 1 + (md * recurvise( x / md , testdiv)); } else { return 1 + (md * x); } } long mostdiv(long x){ long most = 1; for (int i = x; i > 0; i--) { long temp = recurvise(x, i); if(temp > most){ most = temp; } } return most; } long int longestSequence(int a_size, long int* a) { // Return the length of the longest possible sequence of moves. long int sum = 0; for( int i = 0; i < a_size; i++){ long test = mostdiv(a[i]); // printf("test %d : %ld\n",i,test); sum += test; } return sum; } int main() { int n; scanf("%i", &n); long int *a = malloc(sizeof(long int) * n); for (int a_i = 0; a_i < n; a_i++) { scanf("%li",&a[a_i]); } long int result = longestSequence(n, a); printf("%ld\n", result); return 0; }