II тур (районный) олимпиады школьников по информатике Санкт-Петербург, 17 января 1999 года A. Крестики-нолики Е. Рыбинский reverse Компьютер для игры в крестики-нолики на поле 3x3 "Deep Khod" находит наилучший ход во всех позициях, которые могут возникнуть в процессе игры. Группе разработчиков этого компьютера необходимо знать объем памяти, требуемый для запоминания всех таких позиций. Примите участие в создании компьютера и напишите программу, находящую количество всех возможных позиций, в которых ни одна из сторон еще не выстроила три своих символа в ряд. Наш корреспондент В.П. прислал по электронной почте из Рыбинска две программы на языках Си и Паскаль, реализующие один и тот же алгоритм. К сожалению, комментарии, записанные по-русски, при пересылке были повреждены и оказались нечитабельными. Определите назначение алгоритма MV и строго докажите, что данный алгоритм делает именно это. Процедура MV вызывается с аргументом к: 1<=к<п. B. Гиперпростые числа var Простое натуральное число называется гиперпростым, если любое число, получающееся из него откидыванием нескольких последних цифр, тоже является простым. Например, число 7331 - гиперпростое, так как и оно само, и числа 733, 73 и 7 являются простыми. Найдите все N-значные гиперпростые числа (1<=N<=9). C. Желтые страницы В известном телефонном справочнике "Желтые страницы" названия абонентов, содержащие числа, упорядочены как обычные строки. Таким образом, абонент Школа N296, экспериментальная предшествует абоненту Школа N42, экспериментальная Напишите функцию сравнения имен абонентов, которая воспринимала бы числовые вставки как числа и обеспечивала корректное упорядочивание названий абонентов. Все сравнения, за исключением вставок натуральных чисел, должны производиться на основе алфавитного порядка. D. Точка в многоугольнике Граница многоугольника Р задается координатами вершин, перечисленными в порядке обхода по часовой стрелке (х1, у1),... (xп, уn). Напишите программу, проверяющую, лежит ли точка (x, у) внутри Р. Все упомянутые координаты целочисленные. х : array [ l . . n ] of integer; procedure MV(k:integer); procedure RV(i, j : integer); va r p,t : i n t e ge r; begin for p:=i to (i+j) div 2 do begin t := x [ p ] ; x[p] := х[j-p+i]; x[j-p+i] := t; end; end; {RV} begin RV(1, n ) ; RV(k+l, n); RV(1, k) end; int x [ n ] ; void RV(int i, int j ) { in t p , t; for(p=i; p<=(i+j) /2;p++) { t=x[p]; x[p]=x[j-p+i] ; x[ j - p + i] = t ; } } void MV(int k){ RV(0,n-l); RV(k,n-l); RV(0,k-l); } F. NANAN Напишите программу, которая вводит числа N и К и находит остаток от деления N(NN) на К. Числа N и К - натуральные, не превосходящие 1000. Имейте в виду, что попытки вычислить непосредственно столь большую степень N могут привести к переполнению и, следовательно, недопустимы.