Liczby Ulama zostały opisane przez polskiego matematyka Stanisława Ulama. Ciąg tych liczb zaczyna się od 1, 2, 3, a każdy kolejny to unikalna suma dwóch, różnych poprzednich elementów.
Liczbą Ulama jest liczba 3 = 1 + 2 oraz 4 = 1 + 3. Jednak liczba 5 nie jest liczbą Ulama, ponieważ może być sumą dwóch różnych par liczb 5 = 4 + 1 = 3 + 2. Okazuje się, że następną liczbą Ulama jest 6 = 4 + 2. Tak samo jak w przypadku wartości 5 liczba 7 może być przedstawiona jako suma 7 = 6 + 1 = 4 + 3, więc nie jest liczbą Ulama.
Ustawiając liczby Ulama w ciąg otrzymamy: 1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, ...
Wśród pierwszych 28 miliardów liczb Ulama liczby 1, 2, 3 oraz 47 są jedynymi liczbami takimi, że x oraz x + 1 są liczbami Ulama (źródło).
W celu wyznaczenia najmniejszej sumy elementów na podstawie k elementów należy wyliczyć sumę każdej pary różnych liczb, a potem sprawdzić, która suma jest najmniejsza i wystąpiła dokładnie tylko jeden raz.
Zauważmy, że minimalna możliwa suma to pierwszy element (zawsze 1) oraz ostatni element z dotychczas wyznaczonych liczb. Z kolei maksymalna to suma ostatniego i przedostatniego elementu z listy. Dodatkowo wiadomo, że szukamy tylko takiej sumy, która jest większa od ostatniego elementu. Na podstawie tych wiadomości wiadomo, że sumy, które będziemy zliczać należą do przedziału [ostatni element + 1, ostatni element + przedostatni element], a to w celu zaoszczędzenia pamięci można uprościć do [0, przedostatni element - 1].
Funkcja tablicaUlama() przyjmuje jeden argument n. Wynikiem działania funkcji jest tablica długości n, gdzie i-ta wartość to i+1 liczba Ulama.
Na początek (2.) deklarujemy tablicę na wyniki i (3. - 4.) wypełniamy pierwsze znane wyrazy. Nastepnie (5.) rozpoczynamy wyznaczanie pozostałych: (6. - 9.) wyznacz minimum i maksimum dla aktualnej tablicy i utwórz tablicę pomocniczą o odpowiedniej liczbie elementów. Następnie (10. - 11.) należy ją wyzerować. Dalsza część polega na (12. - 18.) wyznaczaniu kolejnych sum i zapamiętywaniu wyniku (15.) tylko, gdy należy do poszukiwanego zakresu. Po zakończeniu wybierania par można przejść do (19. - 21.) znalezienia sumy, która wystąpiła dokładnie raz i (22.) przepisania jej. Na koniec (25.) zwracamy tablicę wyników.
W celu przetestowania działania kodu można posłużyć się następującym kodem, który wczyta od użytkownika ile liczb Ulama ma zostać obliczonych: