#include #include #include #include #include #include #include using namespace std; bool isPRIME[1000006]; long long FACTOR[1000006]; long long SPF[1000006]; unsigned long long Count=0; long long ARR[1000005]; vectorprime; void simplesieve() { for(long long p=2;p*p<=1000000;p++) { if(isPRIME[p]==true) { for(long long i=2*p;i<=1000000;i=i+p) isPRIME[i]=false; } } for(int i=2;i<1000000;i++) { if(isPRIME[i]) prime.push_back(i); } } void sieve() { isPRIME[0] = isPRIME[1] = false ; for (long long int i=2; i<=1000000 ; i++) { if (isPRIME[i]) { prime.push_back(i); SPF[i] = i; FACTOR[i]=i; } for (long long int j=0;j < (int)prime.size() && i*prime[j] < 1000000 && prime[j] <= SPF[i];j++) { isPRIME[i*prime[j]]=false; SPF[i*prime[j]] = prime[j] ; FACTOR[i*prime[j]] = FACTOR[i] ; } } } long long largestprimefactor(long long x) { int i=0; while(i!=prime.size()) { if(x%prime[i]!=0) i++; else { x/=prime[i]; if(x<1000000) { x=FACTOR[x]; break; } } } return x; } bool isprime(unsigned long long n) { if(n<=1) return false; if(n<=3) return true; if(n%2==0 ||n%3==0) return false; for(long long i=5;i*i<=n;i=i+6) if (n%i == 0 || n%(i+2) == 0) return false; return true; } unsigned long long maxmoves(unsigned long long n) { if(n<=1000000) if(ARR[n]!=-1) return ARR[n]; if(n==1){ return 1; } else if(n<=1000000 && isPRIME[n]){ if(n<=1000000) ARR[n]=n+1; return n+1; } else if(isprime(n)) { return n+1; } long long k=largestprimefactor(n); if(n<=1000000) { ARR[n]=(k)*maxmoves(n/k)+1; return ARR[n]; } return (k)*maxmoves(n/k)+1; } int main() { memset(ARR,-1,sizeof(ARR)); memset(isPRIME,true,sizeof(isPRIME)); simplesieve(); sieve(); int N; cin >> N; unsigned long long sum=0; vector a(N); for (int i = 0; i < N; i++) { cin >> a[i]; sum+=maxmoves(a[i]); } cout<