#include using namespace std; vector SieveOfEratosthenes(long n) { // Create a boolean array "prime[0..n]" and initialize // all entries it as true. A value in prime[i] will // finally be false if i is Not a prime, else true. vector vect_primes; bool prime[n+1]; memset(prime, true, sizeof(prime)); for (long p=2; p*p<=n; p++) { // If prime[p] is not changed, then it is a prime if (prime[p] == true) { // Update all multiples of p for (long i=p*2; i<=n; i += p) prime[i] = false; } } // Print all prime numbers for (long p=2; p<=n; p++){ if (prime[p]){ vect_primes.push_back(p); } } return(vect_primes); } long long operations(long n, vector &primes) { if(n==1){ return(1); } long plus_grand_prime_div = n; for(long i=0; i=n){ break; } else{ if(n%primes[i]==0){ plus_grand_prime_div = primes[i]; } } } return(1+plus_grand_prime_div*operations(n/plus_grand_prime_div,primes)); } long long longestSequence(vector &a, vector &primes) { long long res = 0; for(int i=0; i primes = SieveOfEratosthenes(1000000); 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,primes); cout << result << endl; return 0; }