object Solution { import Math.max def longestSequence(a: Array[Long]): Long = { // Return the length of the longest possible sequence of moves. def opt(n:Long):Long = { if(n == 1) return 1 if(n == 2) return 3 val bgn = n/2 + 1 if(isPrime(n, false, 2)) return n + 1 else { val temp = largestDivisiblePrime(n, bgn) if(temp == n) return 2 * opt(n / 2) + 1; else return temp * opt(n / temp) + 1; } } def largestDivisiblePrime(n:Long, m:Long):Long = { if(m <= 1) n else { if(isPrime(m, false, 2) && n % m == 0) m else largestDivisiblePrime(n, m - 1) } } def isPrime(n:Long, b:Boolean, m:Long):Boolean = { if(b) !b else if(m > Math.sqrt(n).toLong + 1) true else { isPrime(n, n%m == 0, m + 1) } } (0.toLong /: a) ((x, xs) => x + opt(xs)) } def main(args: Array[String]) { val sc = new java.util.Scanner (System.in); var n = sc.nextInt(); var a = new Array[Long](n); for(a_i <- 0 to n-1) { a(a_i) = sc.nextLong(); } val result = longestSequence(a); println(result) } }