Для моего объяснения я нумерую позицию бита от младшего значащего бита до 0. Таким образом, 3 имеет биты 0 и 1 установлены.5 имеет биты 0 и 2 и т. Д.
В 0-значном числе самый старший установленный бит - это бит 0 (потому что тогда нет другого бита для установки).1 число, где это бит 1 (3).Два числа, где это бит 2 (101 = 5 и 110 = 6).И так далее. m числа, где самый старший установленный бит - это бит m .
Это, в свою очередь, означает, что до и включая числа, в которых бит b более значимый из двух установленных битов - это b * ( b + 1) / 2 числа.Давайте на минутку предположим, что это равно N .Тогда согласно формуле для решения квадратного уравнения b = (sqrt (8 * N + 1) - 1) / 2. Если это не целое число, это потому, что N не совсем соответствует формуле, которую я сказал.Округлите, чтобы найти b , а затем найдите, какой другой бит должен быть установлен, чтобы все было согласовано.
Я специально не даю вам полного решения.Вы хотели решить эту проблему, вы делаете работу.Я надеюсь, что мои данные полезны.
Другая, меньшая, но более простая, оптимизация: Найдите наибольшее N среди тестовых случаев.Вычислите числа последовательности до этого наибольшего N и поместите их в массив (вы можете изменить свой код из вопроса, чтобы сделать это).Затем распечатайте все требуемые результаты, ища их в массиве.Придирки к языку: можно утверждать, что это не буквально оптимизация , поскольку это слово происходит от латинского optimus , что означает best , и оно не дает максимально быстрогопрограмма.