Мы начнем с простой игры, которая
называется Квадраты. Игра начинается с
произвольного целого неотрицательного
числа (скажем, 75). Два игрока по очереди
вычитают из него натуральные числа,
являющиеся полными квадратами (то есть
1, 4, 9, 16, 25 и т.д.), так чтобы оставшееся
число было неотрицательным. Проигрывает
тот, кто не может сделать очередной ход. Вот
как, например, может протекать игра:
75 | ![]() |
50 | ![]() |
46 | ![]() |
30 | ![]() |
5 | ![]() |
4 | ![]() |
0 |
|
0 |
1 |
2 |
3 |
4 |
5 |
![]() |
![]() |
![]() |
Если первый игрок может
сделать ход и попасть в проигрышную
позицию, то изначальная позиция — выигрышная. В противном случае, любая позиция, в которую можно сделать ход, — выигрышная, и поэтому изначальная позиция — проигрышная. |
Чтобы дать вам почувствовать, как все это работает, мы продолжили таблицу 1 и заполнили ее для всех n вплоть до 21. Вот что у нас получилось:
Таблица 2
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
![]() |
![]() |
![]() |
![]() |
![]() |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
![]() |
![]() |
![]() |
![]() |
Как сделать правильный ход
Мало просто знать, что позиция, в которой вы оказались — выигрышная. Надо еще суметь сделать правильный ход.
Пример 1. Начальная позиция: n=19. Какой первый ход нужно сделать? Решение. Взгляните на таблицу 2. Число 19 — выигрышное. Для победы нам необходимо выбрать такой ход, после которого сопернику достанется проигрышная позиция. У нас всего 4 варианта: 18, 15, 10 и 3. Вновь обратимся к таблице 2, и выберем из наших четырех чисел проигрышные. Нам подходят числа 15 и 10: любой из этих ходов оставит сопернику проигрышное число. |
Пример 2. Из начального числа n=18 первый игрок вычел 4, оставив сопернику число 14. Что делать дальше? Решение. И вновь воспользуемся таблицей 2. Мы видим, что 14 — выигрышное число (первый игрок сделал не самый лучший ход!). Поэтому у второго игрока появилась возможность выиграть партию. Для этого ему нужно оставить первому игроку проигрышное число, например, 10. Победа! |
Сейчас мы приведем более эффективный способ определения выигрышных и проигрышных позиций. Этот метод похож на решето Эратосфена, позволяющее находить все простые числа в заданном диапазоне. Предположим, что нам хочется определить исходы всех игр с начальными значениями от 0 до 15. мы знаем, что 0 — проигрышное число:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
![]() |
Добавляя к числу 0 квадраты, мы получаем числа 1, 4, 9, которые являются выигрышными, потому что из них можно попасть в проигрышное число 0:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
![]() |
![]() |
![]() |
![]() |
![]() |
Самое маленькое непомеченное число — 2 — проигрышное, потому что иначе мы бы его уже пометили:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Прибавляя к числу 2 квадраты, получаем новые выигрышные числа (2+1, 2+4, 2+9) :
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Следующее непомеченное число — 5 — снова проигрышное. Продолжая так и далее, мы заполним всю таблицу:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Пример 3. Представьте, что вам
досталось начинать игру с проигрышного
числа 17. Надежды нет? Решение. Только без паники. Теоретически, ваш противник имеет выигрышную стратегию. Но кто вам сказал, что он достаточно хорошо знает математику, и не сделает ошибки по ходу игры? Но представьте на минуту, что первым ходом вы вычитаете из 17 число 16 и оставляете сопернику 1. Тут уже ему ничего не остается, кроме как сделать последний победный ход. Значит, стоит оставлять число как можно большее? И это не так. Самое большое число, которое вы сможете оставить — 16. Но оно является полным квадратом, и второй игрок тут же оставит вам ноль. На самом деле, нужно оставлять такое число, чтобы для победы второму игроку оставалось как можно больше ходов до победы. |
Удаленность позиции характеризует количество ходов, необходимых для завершения партии. Приведенное выше правило основывается на простой идее. Игрок, имеющий выигрышную стратегию, стремится победить как можно быстрее, чтобы свести к минимуму возможность случайной ошибки при выборе очередного хода. Проигрывающий же старается как можно дольше оттягивать свое поражение, надеясь на оплошность соперника. Коротка эту стратегию можно сформулировать так:
ВЫИГРЫВАЙ БЫСТРО, |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
0 | 1 | 2 | 3 | 1 | 2 | 3 | 4 | 5 | 1 | 4 | 3 | 6 | 7 | 3 | 4 | 1 |
Из числа 17 можно получить числа 16, 13, 8 или 1. Их удаленности равны 1, 7, 5, 1 соответственно. Поскольку число 17 — проигрышное, его удаленность на 1 больше, чем наибольшая из удаленностей чисел 16, 13, 8, 1, то есть равна 7+1=8. Из проигрышного числа нужно всегда делать ход в то число, удаленность которого наибольшая возможная. В данном случае это число 13.
В завершение заметим, что нечетное
значение удаленности соответствует
выигрышным позициям, а четное —
проигрышным.
![]() |
11 | ![]() |
![]() |
||||||||||
10 | ![]() |
![]() |
||||||||||
9 | ![]() |
![]() |
||||||||||
8 | ![]() |
![]() |
||||||||||
7 | ![]() |
![]() |
||||||||||
6 | ![]() |
![]() |
||||||||||
5 | ![]() |
![]() |
||||||||||
4 | ![]() |
![]() |
||||||||||
3 | ![]() |
![]() |
||||||||||
2 | ![]() |
![]() |
||||||||||
1 | ![]() |
![]() |
||||||||||
0 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
11 | ![]() |
![]() |
![]() |
![]() |
![]() |
|||||||
10 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
9 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
8 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
7 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
6 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
5 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
4 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||||
3 | ![]() |
![]() |
![]() |
![]() |
![]() |
|||||||
2 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
1 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
11 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||||
10 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
9 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||
8 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||
7 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
6 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
5 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
4 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||||
3 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
2 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
1 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0 | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |