Задача. “Юбилейная” Автор задачи и решения — С.Г. Волченков, г. Ярославль Каждый из расположенных вдоль Н-ского проспекта N фонарных столбов покрашен в один из трех цветов: серый, бурый или малиновый. Главный архитектор хочет, чтобы к юбилею города все столбы имели одинаковый цвет. Он решил составить план перекраски, но знакомиться с имеющейся раскраской у него нет времени. Поэтому план должен быть универсальным, то есть приводить к нужному результату при любой начальной раскраске. План состоит из списка пар столбов. Этот список просматривается последовательно. Если оба столба очередной пары списка имеют одинаковый цвет, то их не трогают, иначе они перекрашиваются в третий цвет (не совпадающий с их цветами). Помогите главному архитектору составить такой план, по возможности меньшей длины. Система оценки В каждом тесте за правильный план вы получаете от половины до полного балла, в зависимости от длины плана. За самый короткий план среди полученных для данного теста вы получите полный балл. Входные данные Вам предлагается решить эту задачу для следующих входных данных: Тест 1: N = 5 Тест 7: N = 34 Тест 2: N = 7 Тест 8: N = 128 Тест 3: N = 8 Тест 9: N = 253 Тест 4: N = 12 Тест 10: N = 511 Тест 5: N = 25 Тест 11: N = 999 Тест 6: N = 32 Тест 12: N = 1000 Формат выходных данных Решением задачи являются выходные файлы. Первая строка выходного файла должна содержать число N для данного теста. Если задачу решить невозможно, вторая строка должна содержать число 0. В противном случае вторая строка должна содержать число M — количество пар в плане, каждая из следующих M строк должна содержать пару чисел — номера столбов. Размер выходного файла не должен превышать 100 килобайт. Примеры N=3 3 0 N=4 4 4 1 3 1 2 2 4 3 4 Примечание Участникам олимпиады предоставлена программа check.exe. Эта программа позволяет проверить любой план для N 1000*. Решение * Данную программу, как и другие материалы олимпиады, можно найти по адресу www.olympiads.ru. Нетрудно убедиться, что при N = 3 решения поставленной задачи действительно не существует. В самом деле, если один из трех столбов окрашен в один цвет, а два других — во любой другой, то любая возможная перекраска приведет к такому же распределению цветов. Исследуем, при каких еще N решений нет. Пусть a, b, c – количество столбов, окрашенных в серый, бурый и малиновый цвет соответственно. После одного шага перекраски их станет: a – 1, b – 1, c + 2. Заметим, что разность числа столбов одного цвета и числа столбов другого цвета либо не изменяется, либо изменяется на три. Отсюда следует, что остатки от деления на три соответствующих разностей не изменяются, т.е. являются инвариантами. В конце процесса должно оказаться N столбов одного цвета и по нулю столбов двух других цветов. Значит, и в начале в какие-то два цвета должно быть раскрашено одинаковое (по модулю 3) количество столбов. При N, делящемся на три, такого может и не быть, например, когда один столб бурый, а остальные — серые. Итак, задача не имеет решения при N кратном 3. Как решать задачу при других N? При N = 2 решение состоит в одной (единственно возможной) перекраске: (1 2). При N = 4 решение приведено в примере: (1 2), (3 4), (1 3), (2 4). Легко заметить, что сначала одинаково красится первая пара столбов, затем — вторая пара, а затем эти две пары перекрашиваются в третий цвет. Аналогичная идея раскрашивания половины столбов в один цвет, другой половины в другой (или такой же) цвет и перекрашивании этих половин в третий цвет может быть положена в основу рекурсивного алгоритма. К сожалению, чтобы этот рекурсивный алгоритм работал, надо, чтобы при каждом вызове количество столбов было четным. Это гарантировано только для N, являющихся степенями двойки. Посмотрим, что можно сделать при нечетном N. Первая идея — отделить один столб, а остальные (их уже четное число) покрасить в один цвет, сразу наталкивается на возражение, что после отделения одного столба может остаться кратное трем число столбов, и задача не сможет быть решена. Вторая идея — отделить три столба, предварительно окрасив их в один цвет. Хотя ровно три столба окрасить в один цвет невозможно, но можно окрасить одинаково четыре столба, а отделить только три из них. Это не изменит делимости количества оставшихся столбов на три. Остальные столбы делим на две группы, рекурсивно красим каждую из них в один цвет, затем рассматривая пары столбов из различных групп красим их все в один цвет и как-то “докрашиваем” отделенные ранее 3 столба. Условием выхода из рекурсии является равенство N двум или четырем. В этих случаях решение приведено выше. Теперь рекурсия будет работать беспрепятственно. Алгоритм “докрашивания” прост. Пусть первые три столба окрашены в цвет X, а остальные — в цвет Y. Тогда, следующая последовательность перекрашиваний достигает нужной цели: (3 4), (1 3), (2, 4). Оценим трудоемкость описанного алгоритма перекраски. Если через T(N) обозначить количество шагов перекраски N столбов, то для четных N имеем следующее рекуррентное соотношение: T(N) = 2T(N/2) + N/2. При нечетных N в этой формуле появляется доплнительное слагаемое 7, связанное с отделением и докрашиванием трех столбов, а также немного изменяется аргумент функции T в правой части (с N/2 на (N – 3)/2). Приблизительным решением этого рекуррентного соотношения является T(N) = (NlogN)/2. Но оказывается, что существует алгоритм и с линейной оценкой трудоемкости, и мы его почти что уже описали. В самом деле, когда мы отделяли три столба, а потом их докрашивали, мы тратили 7 перекрашиваний на эти три столба (4 до отделения и 3 после). Но и остальные столбы можно было таким же образом отделять и докрашивать. Итак, алгоритм таков: отделяем по три столба, предварительно окрашивая их в один цвет, пока не останется два или четыре столба. Окрашиваем оставшиеся столбы в один цвет, а затем докрашиваем в этот цвет по три ранее отделенных столба. Трудоемкость алгоритма составит 7 перекрашиваний на три столба, т.е. 7N/3. Небольшой сравнительный анализ показывает, что до N, примерно равного 30, эффективней оказывается первый алгоритм, а при больших N — второй. Проверка решения Стоит сказать несколько слов об алгоритме проверки представленных решений задачи (алгоритме работы программы check.exe). В данной задаче он не менее интересен, чем само решение. В условии сказано, что алгоритм перекраски должен работать при любой исходной раскраске столбов. Но этих исходных раскрасок может быть 3N. Ясно, что проверить алгоритм на всех исходных данных невозможно. Выборочная же проверка может представить неверный алгоритм, как правильный, что недопустимо. И если бы не нашлось способа полной проверки решений, то задача, скорее всего, вообще не была предложена на олимпиаде. Обозначим цвета числами: серый — 0, бурый — 1, малиновый — 2. Пусть до перекраски столбов их цвета были: X1, X2, …, XN. Что происходит с этим набором цветов при перекрашивании столбов с номерами i и j? Нетрудно проверить, что цвет перекрашиваемых двух столбов становится равным 2(Xi + Xj) mod 3, остальные же столбы при этом не перекрашиваются. Числовое множество, элементами которого являются только три указанных выше значения, а операции сложения и умножения определяются, как обычно, но по модулю 3, называется кольцом вычетов по модулю 3. Если же из элементов этого числового множества строятся строки длины N (N-мерные векторы), и над ними проделываются некоторые операции, в частности, указанные выше, то говорят, что мы работаем в N-мерном векторном пространстве над кольцом вычетов по модулю 3. Итак, после перекраски двух столбов вектор цветов изменяется по некоторому линейному правилу, что эквивалентно умножению этого вектора на некоторую определенную матрицу размера N N. Вторая перекраска приводит к умножению нового вектора на другую матрицу и т.д. Многократная перекраска — это последовательное умножение матриц, что равносильно умножению на одну матрицу M, равную произведению всех. По представленному алгоритму перекраски легко строится эта результирующая матрица M. Компоненты вектора, соответствующего финальной раскраске столбов, — это произведение соответствующей строки матрицы M на вектор исходных наборов цветов. Для того, чтобы все получившиеся цвета были одинаковыми, необходимо и достаточно, чтобы коэффициенты перед переменными X1, X2, …, XN, в выражениях, определяющих окончательные цвета столбов, были одинаковыми, а эти коэффициенты и есть элементы M. Таким образом, для проверки правильности работы алгоритма перекраски достаточно построить соответствующую ему матрицу M и убедиться, что у нее все строки одинаковые.