Задача 1. Лицензионные ключи

advertisement
XX Московская областная олимпиада по информатике
1 тур, 10 февраля 2008 года
Задача 1. Лицензионные ключи
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
Максимальная оценка за задачу:
key.in
key.out
2 секунды
64 мегабайта
100 баллов
Компания Macrohard выпустила в свет новую версию операционной системы «Frames» («Рамки») и
теперь стремится внедрить ее на рынок информационных технологий. Каждая фирма, заказывающая новую
версию «Рамок», получает лицензионные ключи от компании Macrohard по следующим правилам:

каждой копии присваивается уникальный 25-разрядный ключ, состоящий из цифр и
заглавных букв латинского алфавита. Код разбивается на группы по 5 символов, которые
разделяются между собой знаком «-»

по каждому ключу можно вычислить его контрольную сумму по следующему правилу:
необходимо сложить веса значащих символов и взять остаток от деления этой суммы на некое
число P, где вес символа есть
- значение цифры, если символ является цифрой (то есть вес цифры 5 равен пяти)
- порядковый номер буквы в латинском алфавите плюс 9 (то есть вес буквы F равен 15)
Например, для кода 12345-12345-12345-12345-12345 при P = 11 контрольная сумма
равна (1+2+3+4+5)*5 mod 11 = 9

контрольная сумма является идентификатором фирмы, которая покупает операционные
системы, следовательно, оно должно быть различным для разных юридических лиц.
Операционной системой заинтересовался один влиятельный человек, пожелавший установить ее на
свой персональный компьютер. Вам, как работнику отдела лицензирования Macrohard, поручено
сгенерировать новый ключ, который не только не повторяется с выданными ранее ключами, но и обладает
новой (не используемой ранее) контрольной суммой. Требуется написать программу, которая решает эту
задачу.
Формат входных данных
В первой строке входного файла содержится два натуральных числа N и P (1 ≤ N ≤ 30000,
1 ≤ P ≤ 1000), где N – число уже использованных ключей, P – число, используемое для подсчета
контрольной суммы. В следующих N строках следуют ключи, которые задаются в виде
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX, где X – значащий символ (цифра или буква
латинского алфавита).
Формат выходных данных
В выходной файл требуется вывести новый уникальный ключ в соответствии с указанным
форматом, обладающий уникальной контрольной суммой. В случае, если такой ключ сгенерировать
невозможно, выведите слово «Impossible».
Примеры
key.in
3 5
23545-14978-59345-87926-52496
67955-58818-19438-55659-02068
99185-57241-15114-39158-36125
5 3
BGPOV-D618J-FTN7L-4QWZJ-E6P8S
7K3J3-I8076-58COS-0066F-9UAT4
7S17C-YI099-1UC85-5S9PB-772LT
TN2I4-TC1Z6-1OLI6-LT43G-9JMD3
73OQ3-A9NBJ-N7UT7-AI349-XYJDT
5 4
7911L-5D41U-0N09C-34T16-5D0KI
FRLAX-RE1Y1-WFVU0-88R56-C5D4V
RUG51-IR00T-8L812-R6056-7OM59
804F2-L7292-I12PX-14NDO-02LEW
J3QQ4-H7H2V-2HCH4-M3HK8-6M8VW
key.out
01389-28172-62843-79648-28129
1APMP-RSO53-G743I-F5TK6-R6487
Impossible
Страница 1 из 4
XX Московская областная олимпиада по информатике
Задача 2.
1 тур, 10 февраля 2008 года
Феодальные отношения
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
Максимальная оценка за задачу:
feodal.in
feodal.out
2 секунды
64 мегабайта
100 баллов
Во Флатландии с некоторых пор процветают феодальные отношения – у каждого порядочного
феодала есть ровно два вассала, у непорядочных – вассалов нет совсем. Каждый феодал строит свой замок
в городе на прямой, при этом:

высота замка (всегда целое положительное число) должна быть строго больше высот замков
его вассалов (для соблюдения субординации),

замки первого из двух вассалов и всех подчиненных этого вассала должны быть построены
слева, второго вассала и его подчиненных – справа (для пресечения междоусобиц),

высота замка должна быть минимально возможной (для экономии ресурсов),

число всех подчиненных у правого и левого вассалов одинаково (для баланса сил).
Для удобства замки феодалов занумерованы натуральными числами по порядку слева направо,
начиная с единицы, и разбиты на улицы. Улица (i, j) представляет собой последовательность подряд
идущих замков, начиная с замка под номером i и заканчивая замком с номером j (i ≤ j)
Однажды в город приехал новый феодал и пожелал выкупить там замок у одного из жителей. Также
ему стало интересно узнать социальный статус соседей по улице, однако, город к тому времени так
разросся, что феодал уже не мог сделать этого самостоятельно. Напишите программу, которая поможет
ему!
Формат входных данных
Первая строка входного файла содержит число N (1 ≤ N ≤ 30000) — высота замка единственного
главного феодала в городе, который никому не подчиняется. Далее, в следующих двух строках идут числа i
и j, задающие улицу (i, j), на которой хочет приобрести замок новый феодал (гарантируется, что замки с
номерами i и j находятся в черте города, i ≤ j, j – i ≤ 105).
Формат выходных данных
В выходной файл требуется вывести высоты всех замков на указанной улице слева направо через
пробел.
Пример
feodal.in
2
1
3
3
3
7
50
128873293
128873293
feodal.out
1 2 1
1 3 1 2 1
1
Примечание
Будут оцениваться и частичные решения задачи при малых N. Частичные решения для N<20
набирают до 40 баллов, а для N<50 набирают не более 70 баллов.
Страница 2 из 4
XX Московская областная олимпиада по информатике
Задача 3.
1 тур, 10 февраля 2008 года
iCopter
Имя входного файла:
Имя выходного файла:
Максимальное время работы на одном тесте:
Максимальный объем используемой памяти:
Максимальная оценка за задачу:
icopter.in
icopter.out
2 секунды
64 мегабайта
100 баллов
В двухмерной игре для современных мобильных телефонов «iCopter» между Васей и Петей идет
Bluetooth-сражение. Идет третий раунд. Он проходит с применением вертолётной техники в горном
массиве.
Горный профиль в игре «iCopter» задается ломаной (x1, y1), (x2, y2), …, (xN, yN), координаты вершин
которой удовлетворяют неравенствам x1 < x2 < … < xN. Начальные и конечные точки профиля расположены
на уровне моря (y1 = yN = 0).
Над горами летают вертолет Васи и вертолет Пети. Вертолёт Васи находится в точке A с
координатами (XA, YA), Пети — в точке B с координатами (XB, YB). Вертолет Васи производит выстрел
снарядом с начальной скоростью, которая задается вектором с компонентами (VX , VY).
Полёт снаряда проходит по следующим законам движения (они определяют координаты снаряда в
каждый момент времени до столкновения с горой t ≥ 0):
X = XA + VX * t
Y  YA  VY * t 
gt 2
,
2
g  10
В данной версии компьютерной игры снаряд взрывается только от удара в гору. При взрыве снаряд
поражает все цели на расстоянии не больше R от эпицентра взрыва. Вертолёт противника считается
уничтоженным, если он находится в радиусе поражения.
A
B
Требуется написать программу, которая по заданному рельефу, скорости снаряда и координатам
вертолётов определяет точку попадания снаряда в гору и уничтожен ли при этом вертолёт Пети.
Страница 3 из 4
XX Московская областная олимпиада по информатике
1 тур, 10 февраля 2008 года
Формат входных данных
В первой строке входного файла задается семь целых чисел – радиус поражения R (0 ≤ R ≤ 10 000,
координаты точки A, координаты точки B, компоненты вектора скорости снаряда VX, VY ( -104 ≤ VX ≤ 104,
VX ≠ 0, 0 < VY ≤ 104). Точки A и B различны.
Во второй строке находится натуральное число N – количество вершин ломаной (2 ≤ N ≤ 100 000),
которая задает горный профиль. Последующие N строк содержат координаты вершин ломаной (x1, y1), (x2,
y2), …, (xN, yN).
Координаты вершин ломаной, а также точек A и B, задаются парой целых чисел, не превосходящих
по абсолютному значению 106. Гарантируется, что x1 < x2 < … < xN и y1 = yN = 0, а также то, что снаряд
всегда попадает в заданный горный профиль и координата точки попадания xП по оси X лежит в пределах
x1 ≤ x П ≤ xN .
Формат выходных данных
В первой строке выведите координаты точки взрыва с точностью не менее 3 знаков после запятой.
Во второй строке выведите «YES», если вертолёт Пети будет поражен взрывом, и «NO» в противном
случае.
Пример
4
3
0
3
6
4
3
0
3
6
icopter.in
6 6 0 6 -4 4
0
11
0
6 6 1 6 -4 4
icopter.out
4.150749 6.780586
NO
4.150749 6.780586
YES
0
11
0
Страница 4 из 4
Download