package main import ( "fmt" "bufio" "os" "strconv" "math" ) var primes []int64 var primeSet map[int64]bool var memo map[int64]int64 func isPrime(n int64) bool { limit := math.Sqrt(float64(n)) for _, num := range primes { if n % num == 0 { return false } if float64(num) > limit { break } } primes = append(primes, n) primeSet[n] = true return true } func divide(n int64) int64 { if n == 1 { return 0 } if !primeSet[n] { if _, ok := memo[n]; !ok { maxPrime := int64(0) limit := int64(math.Ceil(math.Sqrt(float64(n)))) for _, prime := range primes { if n % prime == 0 { maxPrime = prime } if prime > limit { break } } if maxPrime > 0 { memo[n] = 1 + maxPrime * divide(n / maxPrime) } else { memo[n] = 1 } } return memo[n] } return 1 } func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanWords) scanner.Scan() n, _ := strconv.Atoi(scanner.Text()) arr := make([]int64, n) maxNum := int64(0) for i := 0; i < n; i++ { scanner.Scan() arr[i], _ = strconv.ParseInt(scanner.Text(), 10, 64) if arr[i] > maxNum { maxNum = arr[i] } } primes = []int64{2, 3} primeSet = make(map[int64]bool) limit := int64(math.Ceil(math.Sqrt(float64(maxNum)))) for i := int64(5); i <= limit; i += 2 { isPrime(i) } answer := int64(0) memo = make(map[int64]int64) for _, num := range arr { answer += num + divide(num) } fmt.Println(answer) }