<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=ACMP_644</id>
	<title>ACMP 644 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://acm.khpnets.info/w39/index.php?action=history&amp;feed=atom&amp;title=ACMP_644"/>
	<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=ACMP_644&amp;action=history"/>
	<updated>2026-05-13T12:33:07Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://acm.khpnets.info/w39/index.php?title=ACMP_644&amp;diff=2059&amp;oldid=prev</id>
		<title>Ctrlalt: Новая страница: «== Ссылка на задачу == * [http://acmp.ru/?main=task&amp;id_task=644 ACMP #644 &amp;mdash; Временной ключ-2]  == Комментарии == Ма…»</title>
		<link rel="alternate" type="text/html" href="https://acm.khpnets.info/w39/index.php?title=ACMP_644&amp;diff=2059&amp;oldid=prev"/>
		<updated>2016-07-22T23:06:26Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «== Ссылка на задачу == * [http://acmp.ru/?main=task&amp;amp;id_task=644 ACMP #644 — Временной ключ-2]  == Комментарии == Ма…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Ссылка на задачу ==&lt;br /&gt;
* [http://acmp.ru/?main=task&amp;amp;id_task=644 ACMP #644 &amp;amp;mdash; Временной ключ-2]&lt;br /&gt;
&lt;br /&gt;
== Комментарии ==&lt;br /&gt;
Максимальный ответ в задаче не превышает 2^37. Следовательно, можно считать, что соседние элементы ряда с любым начальным N отличаются не более чем на 37.&lt;br /&gt;
&lt;br /&gt;
Обозначим за R ряд, начинающийся с N = 1: R = { 1, 2, 3, 5, 7, 10, ... }.&lt;br /&gt;
&lt;br /&gt;
Заметим, что ряд, начинающийся с произвольного N, рано или поздно начинает повторять ряд R. Это замечание наводит на идею сведения задачи для произвольного N к задаче для N = 1. Пусть мы умеем: &lt;br /&gt;
* определять, входит ли заданное число в ряд R; &lt;br /&gt;
* по элементу ряда R вычислять его индекс; &lt;br /&gt;
* по индексу вычислять элемент ряда R.&lt;br /&gt;
Тогда решение задачи для произвольных N и K таково: &lt;br /&gt;
* пока N не входит в ряд R и K &amp;gt; 0, выполняем N += S(N), K--;&lt;br /&gt;
* если K = 0, то ответ &amp;amp;mdash; N;&lt;br /&gt;
* иначе вычисляем индекс I числа N в ряду R; ответ &amp;amp;mdash; элемент R с индексом (I + K).&lt;br /&gt;
&lt;br /&gt;
Пусть имеется функция index(X), возвращающая индекс числа X, если оно входит в ряд R, либо -1 в противном случае. Тогда определение того, входит ли X в ряд R, сводится к проверке index(X) &amp;amp;ne; -1. Вычисление элемента по заданному индексу можно осуществить при помощи двоичного поиска (для этого понадобится вспомогательная функция, возвращающая для элементов, не входящих в R, индекс первого меньшего элемента R; такую функцию можно реализовать простым перебором, уменьшая X до подходящего значения: как показано выше, потребуется не более 37 итераций).&lt;br /&gt;
&lt;br /&gt;
Как вычислить index(X)? Требуется предпосчитать следующие значения:&lt;br /&gt;
* iterations[from][add1][power] &amp;amp;mdash; количество итераций, требуемых для получения из числа from числа, не меньшего 2^power; при этом на каждой итерации дополнительно учитывается add1 единиц;&lt;br /&gt;
* result[from][add1][power] &amp;amp;mdash; число, получающееся в результате выполнения описанных выше итераций.&lt;br /&gt;
При помощи данных значений можно восстановить общее число итераций для получения числа X из 1, суммируя количества итераций для получения значащих двоичных единиц от старших разрядов к младшим.&lt;br /&gt;
from, add1 и power находятся в диапазоне от 0 до 37 - 1. Для ускорения предпосчёта следует заметить, что iterations[from][add1][power] часто тривиально выводятся из iterations[from - 1][add1][power].&lt;br /&gt;
&lt;br /&gt;
Предпосчитанный массив нельзя целиком сохранить в коде решения из-за его размера, поэтому следует сохранить только части (from = 0) и (from = 1, add1 = 0). Восстановление остальных частей по данным производится достаточно быстро (с использованием указанного выше соображения).&lt;br /&gt;
&lt;br /&gt;
[[Category: Сборник задач: ACMP]]&lt;br /&gt;
[[Category: Задачи: Прекалк]]&lt;br /&gt;
[[Category: Задачи: Жёсткие ограничения]]&lt;br /&gt;
[[Category: Задачи: Битовая арифметика]]&lt;/div&gt;</summary>
		<author><name>Ctrlalt</name></author>
	</entry>
</feed>