Орієнтовні завдання
ІІ (районного) етапу 2010 року

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ть програму 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.inrace.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.incripto.out
10
ten+ten+forty=sixty
850+850+29786=31486

3. Спіраль чисел (100 балів)
Прямі x = 1/2 + j та y = 1/2 + k при усіх цілих j та k розбивають координатну площину на квадрати. Координати центрів (симетрії) цих квадратів — усі можливі пари цілих чисел. Такі квадрати можна перелічити, тобто занумерувати натуральними числами, різними способами. Наприклад, рухаючись «спіраллю», що складається з відрізків.

5051525354555657
4926272829303158
4825101112133259
4724 9 2 3143360
4623 8 1 4153461
4522 7 6 5163562
4421201918173663
4342414039383764

Якщо рух розпочати з квадрата з центром (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 < 1017.

Приклади

spiral.inspiral.out
10-1 2
-1 210

Програма мовою 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.