Просто ради интереса я попытался решить проблему из категории «Недавние» Project Euler ( последовательность цифр суммы ). Но я не могу придумать, как решить проблему эффективно. Проблема заключается в следующем (в исходной последовательности вопросов в начале есть две, но она не меняет последовательность):
Последовательность цифр составляет 1,2,4,8,16,23,28,38,49 .... где термин последовательности представляет собой сумму цифр, предшествующих ему в последовательности. Найдите член последовательности.
Наивное решение не может быть реализовано, потому что оно занимает много времени. Я пытался свести задачу к случаю матрицы экспоненциации (который был бы занимает количество времени) , но не могли придумать такое повторение подгонки линейных критериев, рецидивы для этой последовательности вполне своеобразно. Видно, что последовательность определяется повторением:
где является n t h термом последовательности, а d является функцией, которая, когда в качестве входных данных задано натуральное число, возвращает сумму цифр числа (например, ). Мой второй подход состоял в том, чтобы попытаться найти какой-то шаблон в последовательности. Можно видеть, что первые несколько членов последовательности можно записать в виде
a_1 = 1
a_2 = 1 + d( 1 )
a_3 = 1 + d( 1 ) + d( 1 + d( 1 ) )
a_4 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) )
a_5 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) + d( 1 + d(
1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) )
Из вышеприведенного шаблона выясняется, что член последовательности может быть сгенерирован следующим способом:
- Напишите 1 с добавлением символа между ними.
- Оставив первый , затем примените функцию d к следующим 2 0 слагаемым, затем к следующим 2 1 слагаемым, затем к следующим 2 2 слагаемым и так далее.
- Затем примените вышеуказанный метод рекурсивно к аргументам каждой применяемой функции .
например, если n = 3, мы выполняем следующие манипуляции:
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + d( 1 ) + d( 1 + 1 ) + d( 1 + 1 + 1 + 1 )
1 + d( 1 ) + d( 1 + d(1) ) + d( 1 + d( 1 ) + d( 1 +d( 1 ) ) )
Путем динамического программирования можно генерировать срок с использованием вышеуказанного метода в времени O ( л о г ( 2 10 15 ) ) , что опять - таки не лучше , чем наивным решения.
РЕДАКТИРОВАТЬ 1
Другое, что можно наблюдать, что . Например, d ( a 6 ) = d ( 23 ) = d ( 32 ) = 5 . Но я не могу использовать эту точку зрения. Я снова попытался найти линейное рекуррентное соотношение (для возведения в степень матрицы), но я не могу его найти.
РЕДАКТИРОВАТЬ 2
Ниже приведен график, когда последовательность строится для меньшего диапазона (первые терминов последовательности нанесены).
PS: я знаю, что не стоит спрашивать решения у Project Euler. Но я просто хочу новое направление или подсказку, поскольку последние несколько дней я двигаюсь по кругу. Если это также неприемлемо, я могу снять вопрос, если предложено.
You are given a106 = 31054319.
в оригинальной проблеме Эйлера это подсказка.