Форум программистов, компьютерный форум, киберфорум
diagon
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Разбор задачи "Число в последовательности"

Запись от diagon размещена 10.03.2012 в 10:23
Показов 59954 Комментарии 3
Метки acmp, разбор

Пока не знаю, какая польза мне будет от этого мини-блога, но все-же попробую его завести.
Изредка буду постить сюда разборы каких-либо олимпиадных задач, либо что-нибудь еще.
Для начала хочу выложить разбор понравившейся мне задачи с acmp.ru "Число в последовательности".
Ссылка на задачу - http://acmp.ru/index.asp?main=task&id_task=464
Условие:
Число в последовательности
(Время: 1 сек. Память: 16 Мб Сложность: 35%)


Последовательность 011212201220200112… строится следующим образом: сначала пишется 0, затем повторяется следующее действие: уже написанную часть приписывают справа с заменой 0 на 1, 1 на 2, 2 на 0, и т.д.

Требуется написать программу, которая по заданному натуральному числу N определяет, какое число стоит на N-ом месте.

Входные данные

Входной файл INPUT.TXT содержит число N (1 <= N <= 2147483647).

Выходные данные

Выходной файл OUTPUT.TXT должен содержать одно искомое число.
Итак, приступим.
Решать будем с помощью рекурсии.
Сразу замечу, что индекс первого члена последовательности будем считать равным единице.

Для начала заметим, что последовательность можно разбить на уровни:
0) 0
1) 01
2) 0112
3) 01121220
Рассмотрим 3 уровень:
0112|1220
Допустим, мы хотим найти седьмое число в последовательности.
Заметим, что можно найти третье число в последовательности и увеличить его, так как седьмое число является увеличенным третьим. А вместо третьего числа можно найти первое, которое уже известно.
Это и есть основная идея решения.

Теперь к деталям.
Допустим, мы знаем текущий уровень последовательности(для седьмого и восьмого числа этот уровень равен 3, для девятого - 4).
Для того, чтобы найти число с индексом n, нам нужно найти индекс числа, из которого это число было образовано. В случае с n=7, этот индекс будет равен 3. Осталось решить вопрос, как найти этот индекс для общего случая.
Мы имеем последовательность длиной length. Разобьем эту последовательность на 2 равные части.
Для примера можно взять 3 уровень последовательности - 0112|1220. Число с индексом n находится в правой части последовательности, число, индекс которого нужно найти - в левой. Несложно заметить, что индекс будет равен (n - length / 2).
Теперь найдем длину последовательности. Очевидно, она равна 2^level, где level - уровень последовательности.
Осталось разобраться с уровнем последовательности. Его можно найти через логарифм по основанию 2.
К сожалению, в c++ нету стандартной функции log2, однако ее можно написать самостоятельно:
C++
1
2
3
4
double log2( int x )
{
    return log(1. * x) / log(2.);
}
Также в задаче есть подводный камень - хотя N <= INT_MAX, максимальная длина последовательности превышает INT_MAX, поэтому для нее следует использовать тип unsigned int.

Итак,
исходный код нашей рекурсивной функции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int inc( int x )
{
    return x == 2 ? 0 : x + 1;
}
 
int foo( int n )
{   
    if ( n == 1 )
        return 0;
    
    int level = log2(n) + 0.9999;
    
    unsigned length = 1 << level; 
    
    return inc( foo(n - length / 2) );
}
Метки acmp, разбор
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для Evg
    Залез по ссылке. Условия задачи не увидел (может для этогорегистрация нужна). Таких приколов всё равно не понимаю. Условие задачи состоит из одного абзаца (скорее всего). Какая проблема закатать текст задачи в блог и не напрягать людей хождением по другим сайтам (где ещё ргеистрация требуется, сайт может в дауне быть, а то и вообще там задачу похерят)?
    Запись от Evg размещена 12.03.2012 в 14:26 Evg вне форума
  2. Старый комментарий
    Аватар для diagon
    Да, извиняюсь, ссылку кривую привел, уже поправил.
    Ну, регистрации для чтения условия там не требуется, да и лично мне удобнее смотреть условие сразу на acmp.ru, однако все же добавил его в пост. Просто потому, что лично мне стало лень тыкать на ссылки из-за редиректа. Возможно, я не один такой.
    Запись от diagon размещена 14.03.2012 в 18:22 diagon вне форума
  3. Старый комментарий
    Аватар для Evg
    В условие задачи надо включить ограничение по времени и памяти (что критично, ибо влияет на выбор алгоритма решения).
    Запись от Evg размещена 14.03.2012 в 21:09 Evg вне форума
 
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru