Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
5 / 5 / 1
Регистрация: 14.07.2012
Сообщений: 27
1

Олимпиадная задача

27.09.2012, 22:08. Показов 7020. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Лампочки
(Время: 2 сек. Память: 16 Мб Сложность: 94%)
Имеется ряд из N лампочек, которые пронумерованы от 1 до N. Изначально ни одна из лампочек не горит. Далее происходит K последовательных линейных инверсий этого ряда ламп. Под линейной инверсией понимается инверсия каждой P-й лампочки в ряде. Например, если P=3, то произойдет инверсия 3й, 6й, 9й и т.д. лампочек.

Требуется определить: сколько горящих лампочек останется после реализации всех заданных линейных инверсий?

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

В первой строке входного файла INPUT.TXT заданны числа N и K – число лампочек и число линейных инверсий. Вторая строка состоит из K целых чисел Pi, задающих период данных инверсий. (1 <= N <= 109, 1<=K<=100, 1 <= Pi <= 50)

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

В выходной файл OUTPUT.TXT следует вывести ответ на задачу.

Долго ломал голову. Нашёл вот этот пост ссылка удалена
Но толком не понял, какая формула для произвольного N подразумевается, и как отсекаются лишние слагаемые?

 Комментарий модератора 
Ссылки на сторонние форумы запрещены


Добавлено через 19 минут
Поскольку ссыль удалили, вот то сообщение
Берем первое число P1, тогда после применения будут гореть N/P1 лампочек (тут и далее подразумевается округление вниз).
Берем второе число P2, после второй инверсии будут гореть N/P1 + N/P2 - N/НОК(P1, P2) * 2 ламочек (поясню, мы считаем сколько зажигает лампочек каждая инверсия поотдельности и вычитаем из них кол-во лампочек, зажженных обоими).
Для трех инверсий: N/P1 + N/P2 + N/P3 - N/НОК(P1, P2) * 2 - N/НОК(P1, P3) * 2 - N/НОК(P2, P3) * 2 + N/НОК(P1, P2, P3) * 4.
И так далее. По индукции всё получается довольно просто.

Вот только при наивном подходе у нас в сумме будет 2^K слагаемых, что, вообще говоря, отрицательно сказывается на производительности. Но функция НОК растет довольно быстро (хоть у нее и более одного аргумента, но, думаю, понято, что я имею ввиду), и поэтому большинство слагаемых будут равны нулю! Поэтому применяем идею: как только HOK(...) превышает N, то это слагаемое и все последующие в которых учавствуют теже аргуменеты (+плюс какие-то другие) можно не считать.
Осталось научится быстро определять такие нулевые слагаемые.
Для этого заводим отображение M: p -> i, где p - инверсия, i - коэффициент перед слагаемым в сумме.
Изначально M пусто, и для каждого k (1 <= k <= K) добавляем в M пару (Pk -> 1) и обновляем отображения для всех элементов M - то есть добаляем пару (НОК(Pk, pj) -> -2*ij), где (pj -> ij) - уже существующая пара в M.

Пример, если у нас N=100, и на вход пришли числа 3, 4, 5, 8 то M будет эволюционировать так:
k = 0:
pi


k = 1:
pi
31


k = 2:
pi
31
41
12-2


k = 3:
pi
31
41
12-2
51
15-2
20-2
604


k = 4:
pi
31
41
12-2
51
15-2
20-2
604
8-1
242
402
120-
120 не вошло в M, т.к. N < 120

Все, теперь, когда у нас M построено, то кол-во лампочек считается элементарно:
Sum_{k \in M}( (N / pk) * ik)


Работает довольно быстро (при тупой реализации в худшем случае - одна десятая секунды), памяти практически не нужно (ну пара сотен килобайт - максимум) (лень сейчас получать оценки сложности, кому интересно - посчитайте).
Единственно, очевидную оптимизации в виде удаления пар одинаковых чисел на входе лучше тоже сделать, хотя и без нее не сильно медленее получается.

Добавлено через 1 минуту
Надеюсь, админы меня не покарают
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2012, 22:08
Ответы с готовыми решениями:

Олимпиадная задача
Доброго времени суток! Есть задача, которую я приложил в текстовом документе. Сюда я ее не скинул...

Олимпиадная задача по информатике
Здравствуйте. Попалась интересная задача по информатике, но никак не могу подступиться к задача(....

Олимпиадная задача. Средние элементы массива.
Cнова &quot;олимпиадная задачка&quot; :) Но в этот раз, я тупо не знаю, что делать. Сама задача: ...

Выборы заведующего кафедрой [ОЛИМПИАДНАЯ ЗАДАЧА]
Попалась задача на олимпиаде, смог решить на 2 ОК из 20, кажется, где-то в алгоритме ошибся. Буду...

0
27.09.2012, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2012, 22:08
Помогаю со студенческими работами здесь

Олимпиадная задача "Интересный прямоугольник"
Решение сразу показалась не очень-то и сложным. Но теперь зашёл в тупик. Задача на геометрию....

олимпиадная задачка
На доске наклеено несколько листов объявлений. Все они прямоугольной формы. Некоторые письма...

Олимпиадная подготовка
Многие из участников форума принимают участие в различных олимпиадах, конкурсах по...

Подсуммы (олимпиадная задачка), нужны идеи
64 megabytes / 1 seconds / stdin / stdout Не все числа одинаково полезны. Если, например, вам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru