#include #include #include #include #include #include #include #define MAX_PRIMES 0x00FFFFFF long int primeTbl[MAX_PRIMES] = { 0 }; int maxPrimeIdx = -1; int isPrime(long int n) { if (n <= 1) return 0; if (n <= 3) return 1; if (n%2 == 0 || n%3 == 0) return 0; for (long int i = 5; i*i <= n; i += 6) if (n%i == 0 || n%(i+2) == 0) return 0; return 1; } void UpdatePrimeTable(long int n) { if (n <= 1) return; // Build prime numbers table upto n for(long int i = primeTbl[maxPrimeIdx] + 1; i <= n && i < MAX_PRIMES; i++) { if(isPrime(i)) { primeTbl[++maxPrimeIdx] = i; } } } long int minPrimeDivisor(long int n) { for(long int i = 1; i <= maxPrimeIdx && primeTbl[i] <= n; i++) { if(n != primeTbl[i] && n%primeTbl[i] == 0) return primeTbl[i]; } //n is not divisible. check if n is prime and update prime numbers table UpdatePrimeTable(n); return 0; } long int findMaxSticks(long int n) { if(n == 1) return n; long int minDiv = minPrimeDivisor(n); if(minDiv == 0) { return n + 1; } long int res = (n + findMaxSticks(n/minDiv)); return res; } long int longestSequence(int a_size, long int* a) { // Return the length of the longest possible sequence of moves. primeTbl[++maxPrimeIdx] = 1; primeTbl[++maxPrimeIdx] = 2; primeTbl[++maxPrimeIdx] = 3; long int result = 0; for(int i = 0; i < a_size; i++) { result += findMaxSticks(a[i]); } return result; } 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; }