#include using namespace std; long upper = pow(10, 6); vector prime; // prime table bool is_prime(long n) { long sqrt_n = sqrt(n); for (int i=0; prime[i] <= sqrt_n; ++i) { if (n % prime[i] == 0) return false; } return true; } void make_prime() { long upper = pow(10, 6)+1; vector p(upper, true); p[0] = p[1] = false; for (long i = 2; i <= upper; ++i) { if (p[i]) prime.push_back(i); for (int j=0; i*prime[j] <= upper; ++j) { p[i*prime[j]] = false; if (i % prime[j] == 0) break; } } //cout << "Prime size: " << prime.size() << endl; //for (int i=0;i lg; // longest sequence of n void init_lg() { lg[0] = 0; lg[1] = 1; for (int i=0;i get_factors(long n) { map result; //long sqrt_n = sqrt(n); for (int i=0; prime[i] <= n; ++i) { while (n % prime[i] == 0) { result[prime[i]]++; n = n/prime[i]; } if (n == 1) break; if (is_prime(n)) { result[n]++; break; } } return result; } long longestSequence(long n) { if (n == 1) return 1; if (is_prime(n)) return n+1; long ans = 1; long move = 1; long prev_move = 1; map factors = get_factors(n); map::reverse_iterator rit = factors.rbegin(); for (;rit != factors.rend(); rit++) { //cout << "(" << rit->first << ", " << rit->second << ")" << endl; for (long i=0;isecond;i++) { move = prev_move* (rit->first); ans += move; prev_move = move; //cout <<"ans:" << ans << " move: " << move << endl; } } return ans; } long longestSequence(vector a) { // Return the length of the longest possible sequence of moves. long ans = 0; for (int i=0, n = a.size(); i < n; ++i) { ans += longestSequence(a[i]); } return ans; } // 15=21,21=29,35=43,24=46,100=181,6=10,7=8 int main() { make_prime(); 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; }