#!/bin/ruby class Node attr_reader :squares, :quantity attr_accessor :next_nodes def initialize(squares,quantity) @squares = squares @quantity = quantity @next_nodes = [] end end class Trie attr_reader :score def initialize(start_squares) head = Node.new(start_squares, 1) trie = create_trie(head) @score = calc_moves(head, head.quantity) end def calc_moves(node, total) total *= node.quantity if !node.next_nodes.empty? node.next_nodes.map do |next_node| sub_total = total + calc_moves(next_node, total) end.max else total end end def create_trie(node) squares = get_factors(node.squares) squares.each do |square| quantity = node.squares / square new_node = Node.new(square, quantity) node.next_nodes << new_node create_trie(new_node) if new_node.squares > 1 end end def get_factors(squares) potential_factors = (1...squares).to_a potential_factors.select do |potential_factor| squares / potential_factor.to_f == ( squares / potential_factor) end end end def longestSequence(a) a.reduce(0) do |sum, squares| trie = Trie.new(squares) sum += trie.score end end n = gets.strip.to_i a = gets.strip a = a.split(' ').map(&:to_i) result = longestSequence(a) puts result