Министерство науки и высшего образования Российской Федерации
Российский совет олимпиад школьников
Национальный исследовательский университет ИТМО

Информатика. Заключительный этап. 10 класс.

Протокол результатов

Участник: Платонов Алексей Андреевич
Класс: 10
Дата и время прохождения: 15.03.2026, с 09:35:50 до 12:13:19
Баллы: 14 из 21

Работа участника

1. Кодирование информации. Системы счисления: Два умножения

Условие задачи:

Про некоторое положительное вещественное число, меньшее 11, известно следующее:

  1. Если это число умножить на 2101222^{ 122 }_{10}, результат окажется целым числом.
  2. Если это число умножить на 9109_{10} и перевести запись в двоичную систему, окажется, что эта запись числа не содержит значащих нулей.

Сколько существует таких чисел?

В ответе укажите целое число. Если таких чисел не существует или их бесконечно много, укажите в ответе NULLNULL.

Примечание: число 0.120.1_2 содержит значащий ноль.

Пример записи ответа:
17

Ответ участника:

NULL


2. Кодирование информации. Объём информации: Соты

Условие задачи:

Петя пишет систему управления роботом, который перемещается по плоскости с гексагональной разметкой — правильными шестиугольниками, примыкающими друг к другу одним из ребер. Каждая команда программы перемещает робота на смежный шестиугольник в одном из шести возможных направлений. Петя решил записывать программу в память робота как последовательность кодов команд, используя для записи каждой команды минимально возможное, одинаковое для всех команд количество бит. Петя посчитал, что тогда в сегмент памяти, который у него есть, можно поместить программу длиной ровно 81928192 команды.

Вася обратил внимание на такую особенность робота Пети — любая его программа всегда имеет количество команд, кратное 128128. Он предложил рассматривать программу робота как последовательность подпрограмм, длиной 128128 команд, кодируя каждую такую подпрограмму минимально возможным, одинаковым для всех возможных подпрограмм количеством бит.

Определите максимальную длину программы (кратную 128128), которую можно записать в сегмент памяти, кодируя по методу Васи. В ответе укажите целое число.

Пример записи ответа:
512

Ответ участника:

9472


3. Основы логики: Переусложнили...

Условие задачи:

Обозначим за XX некоторое натуральное число, записанное с помощью n+1n + 1 бит, т.е. X=(xnxn1...x0)2X = (x_{n}x_{n-1}...x_{0})_{2}. Например, если n=3n = 3 и X=01012X = 0101_2, то x3=0,x2=1,x1=0,x0=1x_3 = 0, x_2 = 1, x_1 = 0, x_0 = 1.

Даны логические функции A(X)A(X) и B(X)B(X):

A(X)=i=0n1(xixi+1)(xnx0)A(X) =\bigwedge\limits_{i=0}^{n-1} \left( x_{i} \to x_{i+1} \right) \wedge (x_{n} \to x_{0})

B(X)=i=0(n1)/2¬(M(xi,xi+(n+1)/2,1)M(xi,xi+(n+1)/2,0))B(X) = \bigvee\limits_{i=0}^{\lfloor {(n-1)}/{2} \rfloor} \neg \left( M(x_{i}, x_{i+ \lceil {(n+1)}/{2} \rceil }, 1) \equiv M(x_{i}, x_{i+ \lceil {(n+1)}/{2} \rceil }, 0) \right)

Здесь a\lfloor a \rfloor — значение aa с округлением вниз, a\lceil a \rceil — значение aa с округлением вверх.

Функция M(a,b,c)M(a, b, c) задана таблицей истинности:

aa bb cc M(a,b,c)M(a, b, c)
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

Сколько существует чисел XX таких, что A(X)=B(X)A(X) = B(X), если n=19n = 19? В ответе введите целое положительное число.

Примечание: битовая последовательность может начинаться с нуля.

Пример записи ответа:
17

Ответ участника:

1022


4. Кодирование информации. Алгоритмы обработки кодированной информации: Взломщик поневоле

Условие задачи:

Вася изучает алгоритмы шифрования и решил придумать свой собственный алгоритм. Он решил, что его алгоритм будет рассчитан на шифрование слов из букв современного латинского алфавита. Для каждой буквы в тексте Вася применяет следующие шаги:

  1. Выяснить номер этой буквы в алфавите (Вася пронумеровал буквы от 11 до 2626).
  2. Выяснить номер в алфавите ii-й буквы ключа.
  3. Перемножить два данных числа - это и есть Васин код для буквы текста.
  4. Увеличить ii на 11 и взять по модулю длины ключа.

Исходно i=0i = 0, а нумерация букв в ключе и в тексте для шифрования начинается с нуля.

Чтобы проверить свой алгоритм, Вася взял фразу «the quick brown fox jumps over the lazy dog», убрал из неё пробелы, повторил её 1515 раз подряд и зашифровал полученный текст.

В результате он получил следующую последовательность чисел (см. файл по ссылке). Потом Вася решил проверить, можно ли расшифровать результат и понял, что потерял ключ. Единственное, что он помнит: все символы в ключе были различными. Помогите Васе выяснить, каким был ключ. В ответе введите последовательность строчных букв латинского алфавита без пробелов. Если же восстановить ключ невозможно, укажите в качестве ответа NULLNULL.

Примечание. Латинский алфавит: abcdefghijklmnopqrstuvwxyz.

Пример записи ответа:
abcdef

Ответ участника:

ekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztmsekralgbndyvowqpcxztms


5. Алгоритмизация и программирование. Анализ алгоритма, заданного в виде блок-схемы: Спустя вечность

Условие задачи:

Аксель любит строить разные последовательности, и вчера ему пришёл в голову алгоритм, который показан ниже в виде блок-схемы:

Блок-схема алгоритма

В качестве tt Аксель вводит массив, содержащий битовую последовательность из 2322^{32} нулей. Нумерация элементов массива начинается с нуля.

Определите, какая последовательность из 88 бит будет находиться, начиная с индекса 42949670964294967096 (4294967096,4294967097,...,42949671034294967096, 4294967097, ..., 4294967103). В ответ введите последовательность бит в порядке возрастания их индексов в последовательности без пробелов.

Пример записи ответа:
01010101

Ответ участника:

10010110


6. Телекоммуникационные технологии: Управление перегрузкой

Условие задачи:

Основная задача протокола TCP – обеспечение надежной доставки данных. Одна из возможных проблем – потеря сообщений на промежуточных устройствах в силу ошибок или переполнения памяти. Для предотвращения таких потерь используется управление перегрузкой в TCP.

В управлении перегрузкой отправитель регулирует скорость передачи данных, постепенно увеличивая ее (мы все же хотим передавать данные как можно быстрее) и уменьшая скорость передачи при возникновении ошибки. Существует множество алгоритмов управления перегрузкой. Одни их них – Tahoe. В нем используются следующие понятия:

  • RTT (Round-Trip Time) — номинальное время полного пути пакета, то есть интервал между отправкой сегмента TCP и получением соответствующего ACK (подтверждения). Учтите, что это эталонное значение. В течение времени, равного RTT, отправитель может отправить большое количество пакетов, не дожидаясь ACK.

  • cwnd (Congestion Window) — окно перегрузки, переменная на стороне отправителя, определяющая максимальное количество неподтверждённых сегментов, которое можно отправить в сеть без ACK. Этим окном как раз ограничивается скорость передачи. Чем больше окно, тем быстрее (интенсивнее) отправляются TCP-сегменты.

  • MSS (Maximum Segment Size) — максимальный размер полезной нагрузки TCP-сегмента (обычно 14601460 байт для Ethernet); используется как единица для роста cwnd.

  • ssthresh (Slow Start Threshold) — пороговое значение окна перегрузки; разделяет фазы медленного старта (см. далее) и предотвращения перегрузки. В Tahoe изначально ssthresh не задаётся фиксированно (принимается равным бесконечности), а устанавливается динамически при первой потере. Будем считать (несколько упрощая), что при первой потере ssthresh = cwnd/2/2.

  • Slow Start — фаза управления перегрузкой, где cwnd удваивается каждый RTT (при начальном значении, равном 11 MSS), чтобы быстро «нащупать» реальную пропускную способность сети.

  • Congestion Avoidance — фаза, наступающая после достижения ssthresh. В этой фазе cwnd растёт линейно (+1+1 MSS за RTT), чтобы стабилизировать передачу без перегрузки.

Сначала скорость передачи растет согласно Slow Start, а как случается первая потеря, рассчитывается ssthresh, после чего cwnd сбрасывается в 11 MSS, заново запускается Slow Start (cwnd удваивается каждый RTT), но уже до установленного ssthresh. Достигнув ssthresh, алгоритм переходит в режим Congestion Avoidance, при котором рост cwnd +1+ 1 MSS за RTT, пока не произойдет новая потеря, после чего ssthresh уменьшается вдвое снова. Это создаёт «зубчатую» кривую cwnd.

Например, если потеря случилась при cwnd=256256 MSS, то ssthresh = cwnd/2/2=128128 MSS, cwnd сбрасывается в 11 MSS, возврат в Slow Start — cwnd удваивается каждый RTT до нового ssthresh (128128 MSS). Достигнув ssthresh, переход в Congestion Avoidance — рост cwnd +1+1 MSS за RTT, пока не произойдет новая потеря.

Пусть передается файл из 6464 сегментов (по 14601460 байт) передаётся по сети с RTT = 120120 мс. Используется алгоритм TCP Tahoe.

  • Slow Start: cwnd удваивается каждый RTT, начиная с 11 MSS.
  • После потери: ssthresh = cwnd /2/ 2, cwnd = 11 MSS.
  • Достигнув ssthresh, переход к Congestion Avoidance (+1+1 MSS/RTT).
  • Потеря происходит при cwnd = 1616 MSS.

Найдите общее время передачи всех 6464 сегментов в миллисекундах. Выберите наиболее близкий к полученному значению вариант ответа:

Ответ участника:

1430


7. Технологии сортировки и фильтрации данных: Расширяя круг общения

Условие задачи:

Для анализа социальных сетей часто применяют понятие социального графа. В социальном графе пользователи являются вершинами, а каждое ребро показывает, что пользователи добавили друг друга в список друзей.

Исследователь собрал социальный граф для некоторых пользователей социальной сети YY. Этот граф хранится в виде одной таблицы friends со следующими полями:

  • first_user_id — целое положительное число, идентификатор первого пользователя;
  • second_user_id — целое положительное число, идентификатор второго пользователя.

При этом пара полей (first_user_id, second_user_id) является первичным ключом.

Каждая такая пара для удобства хранится дважды. Например, если пользователи с IDID 11 и 22 добавили друг друга в список друзей, таблица будет содержать две записи:

first_user_id second_user_id
1 2
2 1

Исследователь собирает данные аккуратно и даёт несколько гарантий:

  • дружба между двумя пользователями всегда хранится двумя строками;
  • нет ситуаций, когда пользователь добавил в список друзей самого себя.

Два различных пользователя знают друг друга через одно рукопожатие, если существует третий пользователь, отличающийся от них и являющийся им другом, но при этом сами пользователи не являются друзьями. Иначе говоря, в социальном графе между этими пользователями нет ребра, но есть путь через одну вершину. Например, если пользователи с IDID 11 и 33 не добавляли друг друга в список друзей, но пользователь с IDID 22 имеет в списке друзей этих пользователей, то пользователи с IDID 11 и 33 знают друг друга через одно рукопожатие.

Определите, сколько различных пользователей знает пользователь с IDID 1010 через одно рукопожатие. Обратите внимание, что самого пользователя и его прямых друзей считать не нужно. В ответе введите одно целое неотрицательное число. Если пользователь с указанным IDID не встречается в таблице, введите 00.

Пример записи ответа:
17

Примечание. В окне ниже можно вводить SQL-запросы для выборки данных.

База доступна для скачивания по ссылке.


8. Технологии программирования: Новый язык

Условие задачи:
Имя входного файла стандартный ввод
Имя выходного файла стандартный ввод
Ограничение по времени 1.5 секунды
Ограничение по памяти 256 МБ

Глеб решил изучить новый для себя язык программирования. Так как C++ показался ему слишком простым, он выбрал язык Bassembly. Язык этот пока молодой, поэтому найти удалось только его документацию.

Доступные регистры на данном языке: eax\mathtt{eax}, ecx\mathtt{ecx}, edx\mathtt{edx}, esi\mathtt{esi} и edi\mathtt{edi}.

Каждый регистр хранит беззнаковое 32-битное целое число. Все арифметические операции над регистрами выполняются по модулю 2322^{32}: при переполнении старшие биты отбрасываются. Например, число 2322^{32} эквивалентно 0, а число -1 эквивалентно 23212^{32}-1.

Bassembly поддерживает пять команд:

add, sub, mul, inc, print.\mathtt{add},\ \mathtt{sub},\ \mathtt{mul},\ \mathtt{inc},\ \mathtt{print}.

Обозначим через reg\mathtt{reg}, reg1\mathtt{reg_1}, reg2\mathtt{reg_2}, reg3\mathtt{reg_3} произвольные регистры из списка выше, а через const\mathtt{const} — неотрицательное целое число от 00 до 23212^{32}-1.

Команда add\mathtt{add}

Команда add\mathtt{add} может иметь несколько форм.

  • add 0 const\mathtt{add}\ 0\ \mathtt{const} — выполнить операцию eax+=const\mathtt{eax} += \mathtt{const}.

  • add 1 reg\mathtt{add}\ 1\ \mathtt{reg} — выполнить операцию eax+=reg\mathtt{eax} += \mathtt{reg}.

  • add 2 reg1 reg2\mathtt{add}\ 2\ \mathtt{reg_1}\ \mathtt{reg_2} — выполнить операцию reg1+=reg2\mathtt{reg_1} += \mathtt{reg_2}.

Команда sub\mathtt{sub}

Команда sub\mathtt{sub} также может иметь несколько форм.

  • sub 0 const\mathtt{sub}\ 0\ \mathtt{const} — выполнить операцию eax=const\mathtt{eax} -= \mathtt{const}.

  • sub 1 reg\mathtt{sub}\ 1\ \mathtt{reg} — выполнить операцию eax=reg\mathtt{eax} -= \mathtt{reg}.

  • sub 2 reg1 reg2\mathtt{sub}\ 2\ \mathtt{reg_1}\ \mathtt{reg_2} — выполнить операцию reg1=reg2\mathtt{reg_1} -= \mathtt{reg_2}.

Команда mul\mathtt{mul}

Команда mul\mathtt{mul} имеет две формы.

  • mul 1 reg1\mathtt{mul}\ 1\ \mathtt{reg_1} — вычислить произведение eaxreg1\mathtt{eax} \cdot \mathtt{reg_1} и сохранить его в пару регистров [ecx:eax][\mathtt{ecx}:\mathtt{eax}].

  • mul 2 reg1 reg2\mathtt{mul}\ 2\ \mathtt{reg_1}\ \mathtt{reg_2} — вычислить произведение reg1reg2\mathtt{reg_1} \cdot \mathtt{reg_2} и сохранить его в пару регистров [ecx:eax][\mathtt{ecx}:\mathtt{eax}].

Здесь запись [ecx:eax][\mathtt{ecx}:\mathtt{eax}] обозначает 64-битное число, у которого старшие 32 бита записываются в ecx\mathtt{ecx}, а младшие 32 бита — в eax\mathtt{eax}.

Команда inc\mathtt{inc}

Команда inc reg\mathtt{inc}\ \mathtt{reg} выполняет операцию reg+=1\mathtt{reg} += 1.

Команда print\mathtt{print}

Команда print reg\mathtt{print}\ \mathtt{reg} выводит текущее значение регистра reg\mathtt{reg}.

Все регистры в начале выполнения программы равны 00.

Но Глеб ещё только учится писать программы на этом языке, поэтому иногда допускает опечатки.

Если название команды в строке записано неверно, то строка считается ошибочной. Если же название команды записано верно, то гарантируется, что все остальные элементы этой строки корректны, кроме, возможно, названий регистров. Таким образом, при корректно записанной команде опечатки могут встречаться только в названиях регистров.

Программа обрабатывается построчно сверху вниз. Если в некоторой строке обнаруживается опечатка, то все предыдущие корректные строки считаются уже выполненными. В частности, должны быть выведены все значения, которые были напечатаны командами print\mathtt{print} в предыдущих строках.

После этого необходимо вывести номер первой ошибочной строки и завершить выполнение.

Если ошибочных строк в программе нет, требуется выполнить все команды по порядку и вывести все значения, которые будут напечатаны командами print\mathtt{print}.

Формат входных данных

В первой строке дано одно число nn — количество команд (1n1051 \le n \le 10^5).

В следующих nn строках содержится описание программы, по одной строке на каждую команду.

Строки программы нумеруются от 11 до nn в порядке их следования во входных данных.

Формат выходных данных

Если в программе встречается ошибочная строка, необходимо вывести все значения, которые были напечатаны командами print\mathtt{print} до первой ошибки, по одному в строке. После этого в отдельной строке необходимо вывести номер первой ошибочной строки.

Если ошибочных строк в программе нет, требуется вывести все значения, которые будут напечатаны командами print\mathtt{print}, по одному в строке.

Пример

Стандартный ввод Стандартный вывод
5
add 0 1000000000
mul 2 eax eax
print eax
print ecx
mal 2 eax eax
2808348672
232830643
5
7
add 0 10
sub 2 ecx eax
inc ecx
print ecx
sub 2 ecx ecx
print ecx
print eax
4294967287
0
10

Примечание

Обратите внимание, что ввод и вывод осуществляется через стандартный ввод и стандартный вывод. В случае отрицательного ответа системы проверки заданий по программированию советуем ознакомиться с "Рекомендациями по решению задач по программированию".

Ответ участника:
class RE(Exception):
    pass

regs = ("eax", "ecx", "edx", "esi", "edi")
s = {name: 0 for name in regs}

def main():
    for i in range(int(input())):
        try:
            command = input().split()
            if not command:
                raise RE
            if command[0] in ("add", "sub"):
                sign = 1 if command[0] == "add" else -1
                if command[1] == '0':
                    s["eax"] = (s["eax"] + sign * int(command[2])) % 2**32
                elif command[1] == '1':
                    if command[2] not in regs:
                        raise RE
                    s["eax"] = (s["eax"] + sign * s[command[2]]) % 2**32
                elif command[1] == '2':
                    if command[2] not in regs or command[3] not in regs:
                        raise RE
                    s[command[2]] = (s[command[2]] + sign * s[command[3]]) % 2**32
                else:
                    raise RE
            elif command[0] == "inc":
                if command[1] not in regs:
                    raise RE
                s[command[1]] = (s[command[1]] + 1) % 2**32
            elif command[0] == "print":
                if command[1] not in regs:
                    raise RE
                print(s[command[1]])
            elif command[0] == "mul":
                reg = "eax"
                if command[1] not in ("1", "2"):
                    raise RE
                if command[1] == '2':
                    if command[2] not in regs:
                        raise RE
                    reg = command[2]
                    command[2] = command[3]
                if command[2] not in regs:
                    raise RE
                res = s[reg] * s[command[2]]
                s["eax"] = res % 2**32
                s["ecx"] = res >> 32
            else:
                raise RE
        except RE:
            print(i + 1)
            break


main()

9. Технологии программирования: Лазерный лабиринт

Условие задачи:
Имя входного файла стандартный ввод
Имя выходного файла стандартный ввод
Ограничение по времени 2 секунды
Ограничение по памяти 256 МБ

Андрею на день рождения подарили две очень интересные вещи: лабиринт и лазер.

Лабиринт представляет собой матрицу из nn строк и mm столбцов. В матрице могут встречаться пустые клетки ., стены #, а также два типа зеркал: L и R.

После этого Андрей начинает запускать лазер из различных точек лабиринта. Когда луч оказывается в некоторой клетке, происходит следующее:

  • если луч находится в пустой клетке, то он продолжает двигаться в том же направлении;
  • если луч находится в клетке с зеркалом L, то направление луча изменяется следующим образом:
    • вверх \to влево;
    • влево \to вниз;
    • вниз \to вправо;
    • вправо \to вверх;
  • если луч находится в клетке с зеркалом R, то направление луча изменяется следующим образом:
    • вверх \to вправо;
    • вправо \to вниз;
    • вниз \to влево;
    • влево \to вверх.

После этого луч пытается перейти в соседнюю клетку в новом направлении.

Если луч пытается выйти за границы лабиринта или перейти в клетку со стеной, его движение немедленно заканчивается.

Вам необходимо ответить на qq запросов. В каждом запросе заданы клетка (x,y)(x, y) и начальное направление луча. Для каждого запроса требуется определить:

  • количество переходов между соседними клетками, которое совершит луч до остановки;
  • либо вывести 1-1, если луч будет двигаться бесконечно, то есть попадёт в цикл.

Формат входных данных

В первой строке дано два целых числа nn и mm — количество строк и столбцов в матрице соответственно (1n,m5001 \le n, m \le 500).

В следующих nn строках дано по mm символов — описание соответствующей строки матрицы. Гарантируется, что каждая клетка содержит один из символов ., #, L или R.

В следующей строке дано одно целое число qq — количество запросов (1q1051 \le q \le 10^5).

В следующих qq строках дано описание запросов, по одному в строке.

Каждый запрос имеет вид xx yy dirdir — стартовая позиция луча и его начальное направление (1xn1 \le x \le n, 1ym1 \le y \le m, dir{left,right,up,down}dir \in \{ \mathtt{left}, \mathtt{right}, \mathtt{up}, \mathtt{down} \}).

Направления left,right,up\mathtt{left}, \mathtt{right}, \mathtt{up} и down\mathtt{down} соответствуют движению влево, вправо, вверх и вниз соответственно.

Гарантируется, что клетка (x,y)(x, y) не является стеной.

Формат выходных данных

Для каждого запроса выведите одно целое число в отдельной строке.

Если луч в некоторый момент остановится, выведите количество переходов между соседними клетками, которое он совершит. Если же луч будет двигаться бесконечно, выведите 1-1.

Обратите внимание, что если луч несколько раз посещает одну и ту же клетку, но с разными направлениями, то это считаются разными состояниями.

Пример

Стандартный ввод Стандартный вывод
3 3
L.L
...
L.L
4
1 2 left
1 2 right
1 2 up
1 2 down
-1
2
1
3
3 3
...
.L.
#LL
5
1 1 down
2 3 left
2 3 right
2 3 down
2 1 right
2
6
1
2
3

Примечание

Обратите внимание, что ввод и вывод осуществляется через стандартный ввод и стандартный вывод. В случае отрицательного ответа системы проверки заданий по программированию советуем ознакомиться с "Рекомендациями по решению задач по программированию".

Ответ участника: Нет ответа