#!/usr/bin/env python3 from collections import namedtuple # Načtení vstupu N = int(input()) nadoby = [int(input()) for _ in range(N)] # cache je tabulka velikosti N*7 # na políčku cache[i][j] je uložen vrchol posloupnosti s největším možným součtem, # jehož zbytek po dělení 7 je `j` CacheItem = namedtuple('CacheItem', ['sum', 'prev', 'index']) cache = [[CacheItem(sum=0, prev=None, index=None) for _ in range(7)] for _ in range(N)] # začneme od začátku procházet všechny nádoby for i in range(N): # pro každou se podíváme, jaké posloupnosti s největším zbytkem a konkrétním zbytkem po dělení v ní končí for y in range(7): # koukneme se na posloupnost nádob, ktera končila o nádobu dříve. K její velikosti přičteme # velikost současné nádoby. Tím získáváme informaci o tom, jak velká by byla posloupnost, # kdyby končila aktuálně zvoleným prvkem # podmínkou zde řešíme problém, že první nádoba nemá žadnou předchozí if i == 0: soucet = nadoby[i] else: soucet = cache[i-1][y].sum + nadoby[i] # Teď se musíme rozhodnout, jestli se nám tato posloupnost líbí nebo ne. Jestli není lepší # variantou tam nádobu `i` nedávat. # Ověříme, jestli už jsme přičtením k jiné posloupnosti nedostali něco lepšího. # Takhle podmínka se může zdát zbytečná, protože když přičítáme konstantu k číslům # s různym zbytkem po dělení, tak dostaneme opět čísla s různým zbytkem po dělení. # Tohle ale ošetruje patologicke případy, které nastávají kvůli výchozímu součtu 0 v cache if cache[i][soucet % 7].sum >= soucet: continue # Když máme vyřešene všechny ošklivé případy, podíváme se konečně, jestli má smysl # posloupnost prodloužit. Jestli náhodou není posloupnost bez té poslední nádoby se stejným # zbytkem po dělení větší. Naše rozhodnutí pak uložíme do tabulky. if cache[i-1][soucet % 7].sum > soucet: cache[i][soucet % 7] = cache[i-1][soucet % 7] else: cache[i][soucet % 7] = CacheItem(sum=soucet, prev=(i-1,y), index=i) # Máme celou tabulku vypočítanou, víme nyní výsledek. Musíme ho ale z tabulky vyčíst. # Koukneme se tedy na poslední prvek tabulky se zbytkem po dělení 0 a procházíme jakoby # spojový seznam tvořený indexy předchozího stavu index = (N-1,0) result = [] while index != None: result.append(cache[index[0]][index[1]]) index = cache[index[0]][index[1]].prev # Dostaneme tak pole `result`, kde jsou všechny indexy použitých nádob # Stačí tedy vypsat. print(result[0].sum, len(result) - 1) for i in reversed(result): if i.index is not None: print(i.index)