Позвольте мне повторить вопрос, который, по-моему, вы задаете, чтобы, если это совершенно не по теме, вы могли сообщить мне:
Дано целое число k и ряды (1, 2), (1, 3), ..., (1, k), (2, 3), (2, 4), ..., (2 , k), (3, 4), ..., (k - 1, k) и индекс n, возвращают значение n-го члена этого ряда.
Вот простой алгоритм решения этой проблемы, который, вероятно, не является асимптотически оптимальным. Обратите внимание, что первая (k - 1) из пар начинается с 1, следующая (k - 2) начинается с 2, следующая (k - 3) с 3 и т. Д. Чтобы определить, какое значение первого элемента в В паре вы можете суммировать эти числа (k - 1) + (k - 2) + ... до тех пор, пока не получите значение, которое больше или равно вашему индексу. Сколько раз вы могли сделать это, плюс один, дает вам ваш первый номер:
E1 = (1, 2)
E2 = (1, 3)
E3 = (1, 4)
E4 = (1, 5)
E5 = (2, 3)
E6 = (2, 4)
E7 = (2, 5)
E8 = (3, 4)
E9 = (3, 5)
E10 = (4, 5)
Здесь k = 5. Чтобы найти первое число слагаемого 8, сначала добавим k - 1 = 4, что меньше восьми. Затем мы добавляем k - 2 = 3, чтобы получить 7, что все еще меньше восьми. Однако добавление k - 3 = 2 даст нам девять, что больше восьми, и поэтому мы остановимся. Мы добавили два числа вместе, и поэтому первое число должно быть 3.
Как только мы узнаем, что такое первое число, вы можете легко получить второе число. Выполняя шаг, чтобы получить первое число, мы по существу перечисляем индексы пар, где меняется первое число. Например, в нашем вышеупомянутом случае мы имели ряды 0, 4, 7. Добавление одного к каждому из них дает 1, 5, 8, которые действительно являются первыми парами, которые начинаются с цифр 1, 2 и 3 соответственно. , Как только вы узнаете, что такое первое число, вы также узнаете, где начинаются пары с этим номером, и вы можете вычесть индекс вашего номера из этой позиции. Это говорит вам, с нулевым индексом, сколько шагов вы продвинулись от этого элемента. Более того, вы знаете, каково второе значение этого первого элемента, потому что это один плюс первый элемент, и поэтому вы можете сказать, что второе значение задается первым числом, плюс один плюс количество шагов, по которым ваш индекс превышает первая пара, начинающаяся с данного номера. В нашем случае, поскольку мы смотрим на индекс 8 и знаем, что первая пара, начинающаяся с тройки, находится в позиции 8, мы получаем, что второе число равно 3 + 1 + 0 = 4, а наша пара - (3, 4) .
Этот алгоритм на самом деле довольно быстрый. Для любого k этот алгоритм выполняет не более k шагов, поэтому выполняется в O (k). Сравните это с наивным подходом сканирования всего, что требует O (k 2 ).