Разбор задач: старшая группа

advertisement
Разбор задач: старшая группа
1. Головоломка. По сути дела, у нас есть две матрицы A и B размерами N*M каждая и
нужно определить, можно ли получить B из A с помощью операций двух типов:
1) Замена в строке 0 на 1 и 1 на 0.
2) Перестановка двух столбцов.
Вначале предположим, что у нас есть только операция типа 2. Нетрудно видеть, что с ее
помощью мы только можем переставить столбцы матрицы A в некотором порядке. Чтобы
из A можно было получить B, нужно, чтобы обе матрицы состояли из одних и тех же
столбцов (с учетом кратности), возможно, расположенных в разном порядке. Поэтому, для
проверки возможности получения B из A можно просто отсортировать столбцы A и B по
возрастанию (мысля столбцы как длинные двоичные числа). Если в итоге получатся
одинаковые матрицы, то решение есть (для получения самих операций нужно сначала
применить все перестановки столбцов, которые привели A к отсортированному виду, а
затем применить все перестановки столбцов, которые привели B к отсортированному
виду, в обратном порядке).
Если добавить операцию типа 1, то решение немного усложняется. Понятно, что не имеет
значения, в каком порядке применять к матрице A некоторый набор операций типов 1 и 2.
Поэтому мы будем сначала применять операции типа 1, а затем – операции типа 2.
Предположим, что решение есть, и мы уже применили все операции типа 1, которые есть
в решении. Понятно, что сейчас 1-й столбец матрицы A должен совпасть с некоторым
столбцом матрицы B, например, с k-м столбцом. Теперь заметим, что если мы потребуем,
чтобы 1-й столбец A после применения некоторых операций типа 1 совпал с k-м столбцом
B, то сами операции, которые нужно применить, определяются однозначно (нужно
перекрасить те строки, в которых эти столбцы различаются). Теперь стало понятным, как
решать задачу: нужно перебирать k, применять операции типа 1 так, чтобы 1-й столбец A
совпал с k-м столбцом B и пробовать получить A из B с помощью операций типа 2. Если
это удастся для некоторого k, то мы найдем решение. В противном случае, решения не
существует.
Сложность полученного решения равна O(NM2logM). Очевидно, что количество
применяемых операций для получения B из A (если это возможно), не превысит 10000.
2. Интересная игра. Скажем сначала несколько слов, касающихся игровых задач вообще.
Во-первых, в любой игре имеет смысл определить понятие игровой позиции,
описывающей текущее состояние игры. Например, в данной игре позиция
характеризуется парой (N, q), где N – текущее количество орешков, а q – максимальное
число орешков, которое можно взять на текущем ходе. Во-вторых, нужно определить,
какие позиции являются выигрышными, а какие – проигрышными. Позиция называется
выигрышной, если игрок, начинающий ходить в данной позиции, может довести игру до
победы независимо от действий соперника. В противном случае позиция называется
проигрышной. В принципе, любая игра может быть решена с использованием двух
простых правил:
1) Если из позиции есть ход в проигрышную позицию, то она – выигрышная. В самом деле,
чтобы выиграть игру из данной позиции, сделаем ход в проигрышную. Следующим ходит
наш соперник и, так как он попал в проигрышную позицию, то, как бы он ни старался, он
проигрывает игру.
2) Если из позиции все ходы ведут в выигрышные позиции, то она – проигрышная. В
самом деле, как бы мы не походили из данной позиции, мы поставим нашего соперника в
выигрышную позицию, и он сможет довести игру до своей победы (нашего поражения)
независимо от наших действий.
С помощью данных правил можно, в принципе, вычислить для любой позиции, является
она выигрышной или проигрышной (по крайней мере, если во время игры невозможно
повторение одной и той же позиции несколько раз). Нужно только добавить еще одно
простое правило: позиции, из которых нет ходов – проигрышные. Проблема часто состоит
в том, что в игре очень много позиций и подобное вычисление занимает очень много
времени и памяти. Так обстоит дело и в нашей задаче.
Разберем теперь решение подзадачи А. Переведем число N в двоичную систему
счисления: N = 2 k1  ...  2 k n , k1>…>kn. Определим f(N) = 2 k n и f(0) =   .
Теорема 1. Позиция (N, q) является выигрышной тогда и только тогда, когда f(N)  q.
Доказательство. Во-первых, очевидно, что позиции, из которых нельзя сделать ход,
проигрышные (так как в них N = 0 и f(N)=   >q).
Далее, покажем, что из выигрышной позиции есть ход в проигрышную. Пусть f(N)  q.
Съедим f(N) орешков и поставим соперника в позицию (N-f(N), f(N)). Так как N-f(N) =
2 k1  ...  2 k n 1 , то f(N-f(N)) = 2 k n 1 > 2 k n = f(N). Поэтому позиция (N-f(N), f(N)) –
проигрышная.
Покажем, что из проигрышной позиции любой ход ведет в выигрышную. Пусть f(N) > q.
Рассмотрим произвольный ход, состоящий в съедении X орешков и ведущий в позицию
(N-X, X). Так как N-X > 2 k1  ...  2 k n 1 , то N-X = 2 k1  ...  2 k n 1  2 l1  ...  2 lt , k1>…>knlt
lr
1>l1>…>lt. Значит, f(N-X) = 2 . Очевидно, что N и N-X делятся на 2 и, следовательно, X
делится на 2 lt . Поэтому X  2 lt = f(N-X) и позиция (N-X, X) выигрышная. 
С учетом того, что игра начинается в позиции (N, N-1) теорема 1 говорит, что
начинающий игрок проигрывает только в тех случаях, когда N – степень двойки. Кроме
того, из доказательства понятно даже, как сделать один из выигрышных ходов (если хотя
бы один такой ход есть). Следующая теорема находит все выигрышные ходы из данной
позиции.
Теорема 2. Если позиция (N, q) – выигрышная, то для победы на первом ходе можно взять
любое количество орешков вида 2 ki  ...  2 k n при условии, что оно не превосходит q.
Других выигрышных ходов из данной позиции нет.
Доказательство. Сначала докажем, что все ходы вида 2 ki  ...  2 k n  q – выигрышны. По
теореме 1, это равносильно тому, что 2 ki 1 > 2 ki  ...  2 k n , что справедливо, так как
2 ki  ...  2 k n  1+2+…+ 2 ki 1 1 = 2 k i 1  1 < 2 ki 1 .
Теперь докажем, что других выигрышных ходов нет. От противного. Предположим, что
есть некоторый выигрышный ход, состоящий в том, чтобы взять X орешков, где
2 ki  ...  2 k n <X< 2 ki 1  ...  2 k n . То есть, позиция (N-X, X) – проигрышная. С другой
стороны, рассмотрим позицию ( 2 k1  ...  2 ki 1 , 2 ki 1  1 ). По теореме 1, она является
проигрышной. Докажем, что 2 k1  ...  2 ki 1 -(N-X) < 2 ki 1 . Действительно, 2 k1  ...  2 ki 1 -(NX) = X – ( 2 ki  ...  2 k n )< 2 ki 1 . Следовательно, из позиции ( 2 k1  ...  2 ki 1 , 2 ki 1  1 ), взяв Y =
2 k1  ...  2 ki 1 -(N-X) орешков, можно попасть в позицию (N-X, Y). Следовательно, позиция
(N-X, Y) – выигрышная, то есть из нее есть ход в проигрышную. Так как Y = X –
( 2 ki  ...  2 k n ) < X, то из позиции (N-X, X) тоже есть ход в проигрышную позицию, а,
следовательно, она – выигрышная. Противоречие. 
Для решения подзадачи B нужно использовать более хитрое представление числа N.
Определим последовательность чисел Фибоначчи следующим образом: F1 = 1, F2 = 2, Fn =
Fn-1+Fn-2, n>2. Запишем число N в виде N = Fk1  ...  Fk n следующим образом: Fk1
выберем как максимальное число Фибоначчи, не превосходящее N; Fk 2 выберем как
максимальное число Фибоначчи, не превосходящее N- Fk1 , и так далее.
Лемма 1. Если N = Fk1  ...  Fk n , то k1>>k2>>…>>kn, где a>>b означает a>b+1.
Доказательство. Воспользуемся индукцией по n. Для n=1 утверждение верно. Далее, если
N = Fk1  ...  Fk n , то N- Fk1 = Fk 2  ...  Fk n , откуда по индукции заключаем, что k2>>…>>kn.
Осталось доказать, что k1>>k2. Понятно, что k1  k2 (так как Fk1 выбиралось
максимальным, не превосходящим N). Если бы было k1 = k2 или k1 = k2+1, то N
 Fk1  Fk 2  Fk1  Fk1 1  Fk1 1 , что противоречит выбору k1. Поэтому k1>>k2. 
Лемма 2. Fn  Fn 1  Fn  3  ...  F1или 2  1(предпоследний член суммы справа зависит от
четности n).
Доказательство. Используем индукцию. Для n = 1 и n = 2 утверждение верно. Для n > 2
имеем по индукции, что Fn  2  Fn  3  Fn  5  ...  F1или 2  1 . Прибавляя к обеим частям этого
неравенства Fn-1, получим требуемое. 
Следствие. Fn 1  Fn 3  ...  Fk  Fn  Fk 1 .
Теперь будем действовать аналогично решению подзадачи A. Определим f(N) = Fk n и f(0)
=  .
Теорема 3. Позиция (N, q) является выигрышной тогда и только тогда, когда f(N)  q.
Доказательство. Во-первых, очевидно, что позиции, из которых нельзя сделать ход,
проигрышные (так как в них N = 0 и f(N)=   >q).
Далее, покажем, что из выигрышной позиции есть ход в проигрышную. Пусть f(N)  q.
Съедим f(N) орешков и поставим соперника в позицию (N-f(N), 2f(N)). Так как N-f(N) =
Fk1  ...  Fk n 1 , то f(N-f(N)) = Fk n 1 = Fk n 1 1  Fk n 1  2  2 Fk n 1  2  2 Fk n = 2f(N). Поэтому
позиция (N-f(N), f(N)) – проигрышная.
Покажем, что из проигрышной позиции любой ход ведет в выигрышную. Пусть f(N) > q.
Рассмотрим произвольный ход, состоящий в съедении X орешков и ведущий в позицию
(N-X, 2X). Так как N-X > Fk1  ...  Fk n 1 , то N-X = Fk1  ...  Fk n 1  Fl1  ...  Flt ,
k1>>…>>kn-1>>kn>l1>>…>>lt. Значит, f(N-X) = Flt . Нужно доказать, что позиция (N-X, 2X)
–
проигрышная,
то
есть,
что
Flt >2X.
Для
этого
выразим
X
=
N-
( Fk1  ...  Fk n 1  Fl1  ...  Flt ) = Fk n  Fl1  ...  Flt .
Таким образом, нужно доказать, что 2 Fl1  ...  2 Flt 1  3Flt  2 Fk n . По следствию из леммы
2
заключаем,
что
Fl1  ...  Flt  Fk n 1  Fk n  3  ...  Fx ,
где
x  lt .
Поэтому
Fl1  ...  Flt  Fk n  Fx 1  Fk n  Flt 1 .
Тогда
2 Fl1  ...  2 Flt 1  3Flt  2 Fk n  2 Flt 1  Flt = 2 Fk n  Flt  2  Flt 1  2 Fk n ,
что
и
требовалось доказать. 
Доказательство теоремы 3 идейно аналогично доказательству теоремы 1, но сложнее в
техническом плане. Из этой теоремы сразу следует, что первый игрок может выиграть во
всех случаях, кроме того, когда N является числом Фибоначчи. Следующая теорема
находит все выигрышные ходы.
Теорема 4. Если позиция (N, q) – выигрышная, то для победы на первом ходе можно взять
любое количество орешков вида Fki  ...  Fk n при условии, что оно не превосходит q и
этот ход ведет в проигрышную позицию. Других выигрышных ходов из данной позиции
нет.
Доказательство. Достаточно доказать, что других выигрышных ходов нет. От
противного. Предположим, что есть некоторый выигрышный ход, состоящий в том, чтобы
взять X орешков, где Fk i  ...  Fk n <X< Fk i1  ...  Fk n . То есть, позиция (N-X, 2X) –
проигрышная. С другой стороны, рассмотрим позицию ( Fk1  ...  Fk i1 , Fk i 1  1 ). По
теореме 3, она является проигрышной. Докажем, что Fk1  ...  Fk i1 -(N-X) < Fk i1 .
Действительно, Fk1  ...  Fk i1 -(N-X) = X – ( Fk i  ...  Fk n )< Fk i1 . Следовательно, из позиции
( Fk1  ...  Fk i1 , Fk i 1  1 ), взяв Y = Fk1  ...  Fk i1 -(N-X) орешков, можно попасть в позицию
(N-X, Y). Следовательно, позиция (N-X, 2Y) – выигрышная, то есть из нее есть ход в
проигрышную. Так как Y = X – ( Fk i  ...  Fk n ) < X, то из позиции (N-X, 2X) тоже есть ход
в проигрышную позицию, а, следовательно, она – выигрышная. Противоречие. 
3. Генератор случайных чисел. Можно переформулировать задачу немного по-другому:
известны X1, …, Xk и Xn = a1Xn-1+…+akXn-k+b. Найти XN mod m.
Обсудим сначала, как просто найти XN. Нам понадобится одно определение.
Определение. Произведением матриц A и B размеров n*n назовем матрицу C размера n*n
такую, что cij = ai1*b1j+…+ain*bnj (здесь и далее, для матрицы, обозначаемой большой
латинской буквой, ее элементы обозначаются соответствующими маленькими латинскими
буквами).
То есть, чтобы вычислить cij, нужно взять j-ю строку матрицы A и просматривать ее слева
направо, взять j-й столбец матрицы B и просматривать его сверху вниз, в порядке
просмотра умножать соответствующие элементы матриц A и B, и все полученные
произведения просуммировать.
Определение. N-й степенью матрицы A размеров n*n называется матрица AN =
A*A*…*A (N раз).
Теорема 1. Для любых матриц A, B, C размеров n*n выполняется равенство (AB)C =
A(BC).
n
Доказательство. Пусть D = AB. Тогда d ij   a ik bkj . Пусть E = (AB)C. Тогда
k 1
n
n
n
n
eij   d il c lj   a ik bkl c lj . Пусть F = BC. Тогда f ij   bil c lj . Пусть G = A(BC). Тогда
l 1
n
l 1 k 1
n
l 1
n
g ij   a ik f kj   a ik bkl c lj . Как видно, eij = gij, поэтому E = G, что и требовалось
k 1
k 1 l 1
доказать. 
По аналогии, как свойство (a+b)+c = a+(b+c) позволяет расставлять произвольным
образом скобки в выражении a1+…+an (но не менять местами слагаемые – это позволяет
другое свойство a+b = b+a, которое не имеет аналога для матриц), теорема 1 позволяет
расставлять произвольным образом скобки в матричной степени A*…*A (N раз). Это
позволять вычислять эту степень за O(logN) матричных умножений. Основная идея
состоит в следующем: если N – четно, то мы применяем рекурсивно тот же самый метод
для вычисления B = AN/2 и далее с помощью одного умножения получаем AN = B2; если же
N – нечетно, то мы применяем рекурсивно тот же самый метод для вычисления B = A(N-1)/2
и далее с помощью двух умножений получаем AN = B2A.
Конечно, быстрое вычисление AN – это хорошо, но что это дает в нашей задаче? Ответ
дает следующая теорема.
Теорема 2. Выполняется следующее равенство:
N 1
1 0 0 ... 0 b 


1 X 1 X 2 ... X k  0 0 0 ... 0 a k 
1 X N X N 1 ... X N  k 1 
1 X X ... X
 0 1 0 ... 0 a 
1 X

k 1
2
3
k 1 
N 1 X N  2 ... X N  k






.........................  0 0 1 ... 0 a k  2 
................................... 




1 X k 1 X k  2 ... X 2 k  ................... 
1 X N  k X N  k 1 ... X N  2 k 1 
0 0 0 ... 1 a1 
Доказательство. Доказательство нетрудно получить из более простого равенства:
1 0 0 ... 0 b 


1 X i X i 1 ... X i  k 1  0 0 0 ... 0 a k  1 X i 1 X i  2 ... X i  k 
1 X
 0 1 0 ... 0 a  1 X

k 1
i 1 X i  2 ... X i  k
i  2 X i  3 ... X i  k 1 




.................................  0 0 1 ... 0 a k  2  ................................... 




1 X i  k X i  k 1 ... X i  2 k 1  ...................  1 X i  k 1 X i  k  2 ... X i  2 k 
0 0 0 ... 1 a1 
Это равенство можно проверить непосредственным умножением. 
Доказанная теорема позволяет вычислять XN за O(logN) матричных умножений. Остается
только одна тонкость – число XN является очень большим. Но, так как нам нужно знать
только XN mod m и в вычислениях используются только сложения и умножения, то и все
промежуточные результаты достаточно хранить по модулю m. То есть, на самом деле
действовать мы будем не с огромными числами, а с числами от 0 до m-1. Нетрудно
видеть, что полученное решение имеет сложность O(k3logN).
Download