Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача A. Интересное число Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 2 секунды 256 мегабайт Для заданного числа N найдите наименьшее положительное целое число с суммой цифр N, которое делится на N. Формат входного файла В первой строчке находится число N (1 ≤ N ≤ 1000). Формат выходного файла В единственной строчке выведите найденное число. Пример стандартный ввод 1 10 стандартный вывод 1 190 Страница 1 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача B. Количество путей Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 1 секунда 64 мегабайт Есть полоска длины N, одна из клеток которой является особенной. Мы можем сделать шаги двух видов – на следующую клетку, или через одну клетку. Необходимо найти общее количество путей, которые: 1) обязательно проходят через особенную клетку; 2) обязательно не проходят через особенную клетку. Например: N = 4, и особенная клетка номер три. Значит у нас есть два пути, которые обязательно проходят через особенную клетку 3 (1 – 2 – 3 – 4, 1 – 3 – 4) и один путь, который не проходит через особенную клетку 3 (1 – 2 – 4). Формат входного файла Единственная строчка входного файла содержит два числа N и M (3 ≤ N ≤ 50, 1 < M < N) – количество клеток и номер особой клетки. Формат выходного файла Единственная строчка выходного файла должна содержать одно число – количество найденных путей. Пример стандартный ввод 4 3 стандартный вывод 3 Страница 2 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача C. Забор Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 4 секунды 128 мегабайт Васе поручили покрасить забор. Каждое утро Вася брал банку с краской и шел красить. Всего в заборе было N дощечек. За один день он красил забор непрерывно от одной дощечки до другой. Васю не интересовал результат, ему нравился сам процесс, поэтому, каждый день цвет краски он выбирал наугад и интервал покраски тоже. Периодически к Васе приезжало руководство и спрашивало, сколько дощечек покрашено в определенный цвет на заданном интервале. Вася возненавидел эти дни, так как в этих случаях ему приходилось выходить на улицу, идти вдоль забора, и считать дощечки с этим цветом. Ваша задача состоит в том, чтобы помочь Васе отвечать на эти вопросы. Формат входного файла В первой строке входного файла задано N и K (1 ≤ N ≤ 105, 0 ≤ K ≤ 105) – количество дощечек в заборе и количество запросов. В следующих K строках заданы запросы – четверки чисел Ti, Li, Ri, Ci (Ti = {0, 1}, 1 ≤ Li ≤ Ri ≤ N, 1 ≤ Ci ≤ 105). Формат выходного файла Для каждого запроса Ti = 0, необходимо покрасить забор в цвет Сi от Li-й до Riй дощечки включительно. Для каждого запроса Ti = 1, необходимо вывести в отдельной строке число – сколько дощечек от Li-й до Ri-й включительно покрашено в цвет Ci. Пример стандартный ввод 5 0 0 1 5 0 1 0 0 3 1 2 1 5 2 1 1 4 стандартный вывод 1 3 1 4 2 4 1 4 5 5 5 3 3 1 2 3 2 Страница 3 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 стандартный ввод стандартный вывод 1 2 4 1 Страница 4 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача D. F*cebook Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 1 секунда 64 мегабайт Социальную сеть f*cebook атаковал вирус. Действие вируса заключается в том, что он разрывает дружественную связь между двумя людьми, иными словами два человека перестают быть друзьями в этой социальной сети. Вирус быстро распространяется, и его нужно как можно быстрее ликвидировать. Вам предстоит задача - посчитать степень поражения сети вирусом. Будем считать, что друзья моих друзей являются мне друзьями тоже, хоть и между нами не установлена явная связь. Тогда вся сеть распадается на отдельные компоненты, в каждой компоненте человек является другому человеку непосредственным другом либо другом через некоторую цепочку людей. Назовем дружественностью всей сети число, которое является суммой квадратов количества людей в каждой компоненте. Формат входного файла В первой строке через пробел заданы числа N и M - количество людей и непосредственных связей о дружбе (2 ≤ N ≤ 100000; 1 ≤ M ≤ 100000). В каждой из следующих M строк через пробел заданы два различных числа — номера людей, которые непосредственно дружат, связи не повторяются. Люди пронумерованы числами от 1 до N, связи пронумерованы числами от 1 до M в том порядке, в котором они перечислены. Далее записано число Q - количество поражений вирусом, (1 ≤ Q ≤ M). В последней строке заданы номера связей, которые разорвал вирус - различные числа, отделяемые друг от друга пробелом. Формат выходного файла Выведите в единственной строке через пробел Q чисел - дружественность сети после каждого поражения. Пример стандартный ввод 4 1 2 1 3 4 2 3 3 4 стандартный вывод 16 10 6 Страница 5 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 стандартный ввод 3 2 4 3 3 1 1 2 1 1 стандартный вывод 3 Страница 6 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача E. Интересный ромб Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 12 секунд 512 мегабайт Лавруша в некоторых клетках поля N * M расставил фишки. Он хочет выбрать ромб, который полностью лежит на поле и который содержит как можно больше фишек. К тому же Лавруша хочет, чтобы в ромбе не было ни единой пары фишек, которые стоят в клетках с общей стороной. Формат входного файла В первой строчке заданы два числа N и M (1 ≤ N, M ≤ 3000). Следующие N строк содержат по M символов каждый. Символом ‘*’ Лавруша обозначает фишку, а символом ‘.’ – свободную клетку. Формат выходного файла Выведите единственное число K – количество фишек в найденном ромбе. Пример стандартный ввод 2 3 ... ..* 3 3 *.* ... *.* 3 3 .*. *.* .*. стандартный вывод 1 1 4 Страница 7 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача F. Бомбёжка Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 1 секунда 64 мегабайт Аня и Женя любят играть в компьютерные игры. Одна из игр в которую они играют, заключается в том, чтобы убить террориста который скрывается в бомбоубежищах. Система бомбоубежищ состоит из N бункеров, которые соединены подземными коридорами, каждый следующий бункер соединен с предыдущим. Аня и Женя по очереди выбирают один из оставшихся в живых бункеров, и бомбят его, при этом кроме самого бункера, куда спущена бомба, взрывается еще и два соседних. В случае бомбежки одного из крайних бункеров, взрывается только один соседний, если же он конечно до сих пор еще не был взорван. Естественно террорист очень хитер, и он всегда успевает убежать от бомбы по подземным коридорам к бункерам, которые еще не были взорваны. Так продолжается до тех пор, пока не будет взорван последний бункер. Так как Аня и Женя ходят по очереди, выигравшим считается тот, кто убьет террориста — т.е. тот, кто взорвет последний бункер. Пример игры. 10 бункеров. Аня ходит первой, и, допустим, взрывает 5-й бункер, тогда в живых остаются бункеры с первого по третий и с седьмого по десятый. Женя может спустить бомбу только на один из этих оставшихся. Допустим, он скидывает бомбу на второй бункер. Тогда для Ани остаются бункеры с седьмого по десятый. В этой ситуации, которая получилась, Аня может оставить в живых либо 2 бункера стоящие рядом, либо один бункер вовсе. В любом случае Женя окажется победителем. Требуется написать программу, которая определяла бы, кто из них выиграет при правильной игре: Аня или Женя. Формат входного файла В единственной строке входного файла находится целое положительное число, не превосходящее 10100000. Формат выходного файла В выходной файл в единственной строке выведите 1, если выиграет Аня (она ходит первая), или 2, если выиграет Женя. Подразумевается, что оба игрока придерживаются оптимальной стратегии. Страница 8 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Пример стандартный ввод 1 4 52 стандартный вывод 1 2 1 Страница 9 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача G. Робот Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 2 секунды 64 мегабайт Компания Booble вплотную занялась разработкой роботов. Первый робот, которого они решили произвести, должен выполнять следующую задачу. Имея в своем распоряжении N кубиков, на каждой гране которого написано по одной букве, составить из них заданное слово длины N. Заданное слово должно отображаться на верхних гранях кубиков в правильном порядке. Эту простую задачу робот должен выполнять как можно меньше затратив энергии. Для этого программистам из этой компании поручили задание – написать программу, оптимизирующую усилия робота для составления слова. Все кубики пронумерованы от 1 до N и лежат вначале последовательно, согласно своим номерам. Робот может выполнять следующие команды: – если у него в руках пусто, подойти к любому кубику и взять его; – если у него в руках кубик, повернуть его так, что одна из четырех боковых граней станет верхней; – если у него в руках кубик, подойти к любому месту и положить туда кубик. При этом, если на месте куда робот ложит кубик уже стоит другой, он берет его в руки. Первую операцию робот выполняет затрачивая мало энергии, можно считать что она равна нулю. Операция с поворотом кубика стоит 1 ед. энергии. Операция с движением робота держа в руках кубик, стоит пропорционально расстоянию которое он проходит, каждый пройденный кубик – 1 ед. энергии (движение робота без кубика ничего не стоит). Напишите программу, которая вычислит минимальную энергию, которую нужно потратить роботом для составления слова. Формат входного файла В первой строке входного файла задано N (1 ≤ N ≤ 50) – количество кубиков. Во второй строке задано слово длиной N, состоящее из маленьких латинских букв – слово которое робот должен составить. В следующих N строках содержатся описания начального положения кубиков, слова из латинских маленьких букв длиной 6. 1-й символ означает букву на верхней гране, со второго по пятый символ – буквы на Страница 10 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 боковых гранях, 6-й символ – буква на нижней гране. Кубики изначально стоят слева на право, в том порядке, в котором указаны во входных данных. Формат выходного файла В выходной файл в единственной строке необходимо вывести число, означающее минимальную энергию необходимую роботом для составления слова. Слово обязательно должно быть составлено так, чтобы первая буква была на месте где стоял 1-й кубик, вторая на месте второго и т.д. Если ответа не существует, нужно вывести -1. Пример стандартный ввод 3 abc bbbbbb cccccc aaaaaa 3 abc ccccac bbbbbb aaaaac 3 abc ccccac bbbbbb ccccca 2 ab ccccac eeeeee стандартный вывод 4 3 1 -1 Пояснение к примеру В первом тесте робот должен взять 3-й кубик и поставить его на место 1-го, взяв его в руки и поставив на место 2-го, взяв его в руки и поставив на место 3-го. Во втором тесте нужно перевернуть один раз 1-й кубик, два раза 3-й кубик. В третьем тесте нужно перевернуть 1 раз 1-й кубик. В четвёртом тесте выложить слово не возможно. Страница 11 из 12 Десятая юбилейная международная открытая студенческая олимпиада по программированию им. С.А. Лебедева и В.М. Глушкова Киев, 2015 Задача H. Монета Имя входного файла: Имя выходного файла: Ограничение по времени: Ограничение по памяти стандартный ввод стандартный вывод 1 секунда 64 мегабайт Петя нашел на улице монету. На одной стороне монеты была нарисована буква ‘T’, на другой стороне ‘H’. Он стал подбрасывать монету и записывать в свой блокнот последовательность букв ‘T’ и ‘H’, которая в результате получалась. На следующий день Петя открыл блокнот и увидел там свою последовательность, записанную им вчера. Он задался вопросом - какое среднее количество подбрасываний необходимо для того, чтобы получить ее снова. Представим, что монета правильная, т.е. ‘T’ и ‘H’ выпадают всегда с одинаковой вероятностью. Петя подбрасывает монету до тех пор, пока в возникающей последовательности букв не получится искомая последовательность. Формат входного файла В первой строке файла задано N (1 ≤ N ≤ 105), длина последовательности. Во второй строке задана сама последовательность Si (Si = {‘T’, ‘H’}, 1 ≤ i ≤ N). Формат выходного файла Вам необходимо вычислить математическое ожидание количества подбрасываний монеты. Так как ответ может быть очень большим, выведите в единственной строке целую часть от логарифма по основанию 2 от математического ожидания - [log2(M)], где M - мат. ожидание количества бросков. Пример стандартный ввод 2 TH 2 TT стандартный вывод 2 2 Пояснение к примеру В первом тесте M = 4, во втором тесте M = 6. Страница 12 из 12