#include #include #include #include #include #include using namespace std; long long find_smallest_divisor(long long n){ long long val_found = -1; long long limit = sqrt(n); for(long long i = 2; i <= limit; ++i ){ if(n % i == 0){ val_found = i; break; } } if(val_found == -1){ val_found = 1; } return val_found; } unordered_map rem; int main() { int n; cin >> n; long long ans = 0; for (int i = 0; i < n; i++) { //cout << "stick: " << i << endl; long long sticks; cin >> sticks; if(rem.find(sticks) != rem.end() ){ ans += rem[sticks]; continue; } long long temp = sticks; long long local_ans = 0; while(true){ long long d = find_smallest_divisor(temp); //cout << "add moves: " << temp << endl; local_ans += temp; temp = temp/d; //cout << "temp: " << temp << endl; if(d == 1){ if(temp != 1){ local_ans += 1; } break; } } rem[sticks] = local_ans; ans += local_ans; } cout << ans << endl; return 0; }