Модераторы: Alx, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск закономерности 
V
    Опции темы
Алкоголик
Дата 11.3.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 26.1.2004

Репутация: нет
Всего: нет



Здраствуйте.
Есть вот такая вот задачка:
"Сначала есть число 5. Безконечное число раз повторяли такое действие: в конец числа копировали самого себя и в второй половине все 5 заменяли на 7, а 7 на 5. Тоисть получось такое: 5
потом 57, потом 5775 потом 57757557 и т.д..
разсотрим такю бесконечнюю последовательность цыфр слева на право
Нужно найти N цифр подряд, начиная с позицыи М
1 <= N <= 1000;
1 <= M <= 1000000000
Например
N=5
M=2
Ответ: 77575"

Понимаю что есть какая то закономерность и можно восоздать кусок строки с нужного символа.. не строя всей строки, но что-то никак сообразить не могу.
Может у кого то есть идеи?

Это сообщение отредактировал(а) Алкоголик - 11.3.2009, 22:14
PM MAIL   Вверх
Akina
Дата 11.3.2009, 23:39 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 2
Всего: 454



Битовая задачка.

Цитата(Алкоголик @  11.3.2009,  23:11 Найти цитируемый пост)
потом 57757557

5 0
7 1
7 10 
5 11
7 100
5 101
5 110
7 111

Как говорится, найдите закономерность.

Hint - чётность количества единиц.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxdiver
Дата 11.3.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 2
Всего: 18



Можно не искать никаких закономерностей, а просто промоделируем процесс для нужного кусочка.

Пусть мы знаем номер K шага (т.е. текущая строка - эта строка, полученная из 5 применением K раз этой операции), и даётся отрезок [A;B]; нужно вернуть строку в этом отрезке. Тогда посмотрим, в какой половине лежит этот отрезок [A;B] - если в левой, то вызовем себя от (K-1, A, B), если в правой, то вызовем себя от (K-1,A,B) и в возвращённой строке обменяем символы 5 и 7 (как описано в условии), если же [A;B] попадает и туда, и туда (т.е. есть непустые отрезки [A;2^(K-1)] и [2^(K-1)+1;B]), то отдельно обрабатываем каждый из них, как описано в предыдущих пунктах, и склеиваем результаты. Особый случай (завершение рекурсии) - если K=1, то просто возвращаем '5'.

Понятно, что чтобы найти ответ на задачу, надо вызвать эту функцию с аргументами (K,M,M+N-1), где K - это такое число, что 2^K>=M+N-1.

Оценка асимптотики (грубая) - O(N^2 log(N+M)), что при данных ограничениях вполне укладывается. Откуда она берётся - всего есть K уровней рекурсии, причём K = O(log(N+M)). На каждом уровне рекурсии, утверждается, функция работала не более N раз. Наконец, один вызов рекурсии (не считая нижележащих уровней) работает за O(N) - затраты на склеивание двух строк и исправление пятёрок и семёрок. В итоге действительно log(N+M) * N * N.

Реализация получится очень простой, намного короче, чем её описание smile

Добавлено через 8 минут и 13 секунд
Akina
Красивое решение, но не зная наперёд, что оно возможно, как-то трудно до него догадаться smile

Это сообщение отредактировал(а) maxdiver - 11.3.2009, 23:49
PM MAIL WWW ICQ   Вверх
Akina
Дата 12.3.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 2
Всего: 454



Цитата(maxdiver @  12.3.2009,  00:48 Найти цитируемый пост)
трудно до него догадаться 

Заняв какое-то место, цифра более не меняется, независимо от количества шагов. Значит, надо посчитать количество инверсий до текущего места.
Цитата(maxdiver @  12.3.2009,  00:48 Найти цитируемый пост)
не зная наперёд

Впервые увидел эту задачу. Решение родилось через 3 минуты.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Алкоголик
Дата 12.3.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 26.1.2004

Репутация: нет
Всего: нет



Akina,  большое спасибо за ваше решение, с помощью его и реализовал...очень красиво...
maxdiver, Вам тоже спасибо, вот ваше решение и вертелось в голове, но никак не мог полностью оформить его в мысль)) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.