package main import ( // "bufio" "fmt" "log" "os" // "errors" // "strconv" // "math" // "sort" // "regexp" // "strings" ) func main() { if os.Getenv("USER") == "alew" { var err error if os.Stdin, err = os.Open("input.txt"); err != nil { log.Fatal(err) os.Exit(1) } } var sticksCnt int fmt.Scanf("%d", &sticksCnt) var score int64 for ; sticksCnt > 0; sticksCnt-- { var stickLen int64 fmt.Scanf("%d", &stickLen) score += splitStickMaxScore(stickLen) } fmt.Println(score) } var splitStickMaxScoreCache = make(map[int64]int64) func splitStickMaxScore(stickLen int64) int64 { if stickLen == 1 { return 1 } if score, ok := splitStickMaxScoreCache[stickLen]; ok { return score } var maxScore, partsCnt int64 for partsCnt = 2; partsCnt <= stickLen; partsCnt++ { if stickLen % partsCnt != 0 { continue } partLen := stickLen / partsCnt score := 1 + partsCnt * splitStickMaxScore(partLen) if score > maxScore { maxScore = score } } splitStickMaxScoreCache[stickLen] = maxScore return maxScore }