1. Вуличнi перегони (100 балів)
Орґанiзацiйний комiтет велосипедних перегонiв Лазуровий Берег-99 звернувся до жандармерiї Сан-Тропе з проханням дозволити провести велосипеднi перегони вулицями цього курортного мiстечка таким чином, щоб кожен учасник мав би певну свободу у виборi шляху до фiнiшу. Жандармерiя у вiдповiдь надiслала в органiзацiйний комiтет план проведення таких перегонiв. На плані пункти-перехрестя було позначено кругами i занумеровано натуральними числами в межах вiд 1 до певного натурального числа n, а окремi дiлянки перегонiв — вулицi з одностороннiм рухом — позначено стрiлками. На цьому планi:
старт — пункт, з якого можна досягнути будь-який пункт перегонiв, i який неможливо досягнути з будь-якого iншого пункту;
фiнiш — пункт, який можна досягнути з будь-якого iншого пункту, i з якого неможливо досягнути жоден iнший пункт.
Деякi пункти неможливо уникнути на шляху вiд старту до фiнiшу, не рахуючи останнiх.
Деякi з пунктiв, якi неможливо уникнути на шляху вiд старту до фiнiшу, розбивають план перегонiв на два плани. Інакше кажучи:
кожен новоутворений план має пункти, вiдмiннi вiд старту й фiнiшу цього плану;
новоутворенi плани не мають спiльних стрiлок, але мають єдиний спiльний пункт, що є фiнiшом для одного плану i стартом для iншого. Цей спільний пункт неможливо досягнути рухом вздовж стрілок, почавши рух з нього самого.
Завдання
Створiть програму race.*, яка допоможе членам органiзацiйного комiтету провести аналiз поданого плану.
Вхідні дані
Кiлькiсть рядкiв вхiдного файлу race.in дорiвнює n — кiлькостi всiх пунктiв перегонiв, що не перевищує 222. Для j в межах вiд 1 до n включно j-ий рядок цього ж файлу мiстить номери кiнцевих пунктiв тих стрiлок, якi виходять з j-го пункту.
Вихідні дані
Перший рядок вихiдного файлу race.out має мiстити у вказаному порядку номери пунктiв, що є стартом i фiнiшом.
Другий рядок цього самого файлу має мiстити кiлькiсть пунктiв, якi
неможливо уникнути на шляху вiд старту до фiнiшу та номери цих пунктiв у
порядку зростання.
Третiй рядок цього самого файлу має мiстити кiлькiсть пунктiв, якими можна розбити поданий план перегонiв на окремi плани, та номери цих пунктiв у порядку зростання.
Приклад
race.in | race.out | план |
---|---|---|
3 3 4 5 6 6 7 8 9 5 9 1 2 |
10 9 2 3 6 1 3 |
2. Криптограма (100 балів)
Завдання
Створiть програму cripto.*, яка дешифрує запису дiї додавання, в якому всi доданки роздiлено знаком +, перед сумою стоїть знак =, а кожну цифру замiнено на лiтеру, причому:
Вхідні дані
Перший рядок вхiдного файлу cripto.in мiстить натуральне число, яке є основою системи числення i лежить в межах вiд 5 до 10 включно.
Другий рядок цього самого файлу мiстить запис дії додавання. Роздiлення доданкiв, суми, знакiв + i = додатковими прогалинами не передбачається.
Вихідні дані
Файл cripto.out має містити всi способи дешифрацiї поданого запису дiї додавання по одному у кожному рядку без повторення (порядок довільний).
Приклад
cripto.in | cripto.out |
---|---|
10 ten+ten+forty=sixty |
850+850+29786=31486 |
3. Спіраль чисел (100 балів)
Прямі x = 1/2 + j та y = 1/2 + k при усіх цілих j та k розбивають координатну площину на квадрати. Координати центрів (симетрії) цих квадратів — усі можливі пари цілих чисел. Такі квадрати можна перелічити, тобто занумерувати натуральними числами, різними способами. Наприклад, рухаючись «спіраллю», що складається з відрізків.
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
49 | 26 | 27 | 28 | 29 | 30 | 31 | 58 |
48 | 25 | 10 | 11 | 12 | 13 | 32 | 59 |
47 | 24 | 9 | 2 | 3 | 14 | 33 | 60 |
46 | 23 | 8 | 1 | 4 | 15 | 34 | 61 |
45 | 22 | 7 | 6 | 5 | 16 | 35 | 62 |
44 | 21 | 20 | 19 | 18 | 17 | 36 | 63 |
43 | 42 | 41 | 40 | 39 | 38 | 37 | 64 |
Якщо рух розпочати з квадрата з центром (0; 0), то кожній парі цілих чисел, що є центром квадрата, можна поставити у взаємно однозначну відповідність одне натуральне число — див. індекс праворуч знизу на такому рисунку.
(–3; 4)50 | (–2; 4)51 | (–1; 4)52 | (0; 4)53 | (1; 4)54 | (2; 4)55 | (3; 4)56 | (4; 4)57 |
(–3; 3)49 | (–2; 3)26 | (–1; 3)27 | (0; 3)28 | (1; 3)29 | (2; 3)30 | (3; 3)31 | (4; 3)58 |
(–3; 2)48 | (–2; 2)25 | (–1; 2)10 | (0; 2)11 | (1; 2)12 | (2; 2)13 | (3; 2)32 | (4; 2)59 |
(–3; 1)47 | (–2; 1)24 | (–1; 1) 9 | (0; 1) 2 | (1; 1) 3 | (2; 1)14 | (3; 1)33 | (4; 1)60 |
(–3; 0)46 | (–2; 0)23 | (–1; 0) 8 | (0; 0) 1 | (1; 0) 4 | (2; 0)15 | (3; 0)34 | (4; 0)61 |
(–3; –1)45 | (–2; –1)22 | (–1; –1) 7 | (0; –1) 6 | (1; –1) 5 | (2; –1)16 | (3; –1)35 | (4; –1)62 |
(–3; –2)44 | (–2; –2)21 | (–1; –2)20 | (0; –2)19 | (1; –2)18 | (2; –2)17 | (3; –2)36 | (4; –2)63 |
(–3; –3)43 | (–2; –3)42 | (–1; –3)41 | (0; –3)40 | (1; –3)39 | (2; –3)38 | (3; –3)37 | (4; –3)64 |
Завдання
Створiть програму spiral.*, яка для описаного способу нумерації квадратів рухом «спіраллю»:
при наявності одного натурального числа n у вхідному файлi spiral.in запише у вихідний файл spiral.out пару цілих чисел x та y, що є координатами центра симетрії квадрата з номером n;
при наявності пари цілих чисел x та y у вхідному файлi spiral.in запише у вихідний файл spiral.out натуральне число n, що є номером квадрата з центром симетрії (x; y).
Для усіх завдань n < 1017.
Приклади
spiral.in | spiral.out |
10 | -1 2 |
-1 2 | 10 |
Програма мовою Turbo Pascal 7.0
для тестування коректності взаємодії з системою тестування Kgrader
{$I-} uses dos,windos; const drive=4; {Номер логiчного пристрою: 1-A, 2-B, 3-C, 4-D, 5-E, 6-F, 7-G, 8-H, 9-I, 10-J, 11-K, 12-L, 13-M, 14-N, 15-O, 16-P, 17-Q, 18-R, 19-S, 20-T, 21-U, 22-V, 23-W, 24-X, 25-Y, 26-Z} np=3; {Кiлькiсть: програм} nc=6; {компiляторiв} p: array[1..np] of pchar = {Назви програм} ('race.*','cripto.*' ,'spiral.*'); c: array[1..nc] of string[16] {Компiлятори} = ('{ Turbo Pascal }', '{ Free Pascal }','{ Turbo Delphi }', '/* TCC */','/* GCC */','/* VC */'); ex=' виявлено'; no=' вiдсутнiй'; yes=' має такий перший рядок: '; var ip,ic,j: byte; dir: pchar; s: string; nofile: boolean; i,o: text; dirInfo: tsearchrec; BEGIN assign (o,'readme.txt'); rewrite(o); GetMem (dir,800); GetCurDir(dir,drive); writeln(o,dir); close(o); reset(o); readln(o,s); close(o); rewrite(o); write(o,'Поточна тека: ',s); j:=length(s); repeat dec(j) until not (s[j] in ['A'..'Z','a'..'z']); if (s[j]<>'\') or (j+9 < length(s)) then writeln(o,' має некоректну назву') else writeln(o); assign(i,'contest.txt'); reset(i); if ioresult <> 0 then writeln(o,'contest.txt ',no) else begin readln(i,s); close(i); writeln(o,'contest.txt ',yes,s) end; for ip:=1 to np do begin nofile:=true; findfirst(p[ip],faarchive,dirinfo); while doserror = 0 do begin write(o,dirinfo.Name+ex+' з '); nofile:=false; assign(i,dirinfo.Name); reset (i); readln(i,s); close (i); if not ((s=c[1])or(s=c[2])or(s=c[3]) or (s=c[4])or(s=c[5])or(s=c[6])) then write(o,'не'); writeln(o,'коректним замовленням комiлятора ',s); findnext(dirInfo) end; if nofile then writeln(o,p[ip],no) end; close(o) END.