Турнир Архимеда(52 задач)
Кировские командные турниры(8 задач)
Барнаульские командные турниры(10 задач)
Московская командная олимпиада(246 задач)
Командные чемпионаты школьников Санкт-Петербурга по программированию(167 задач)
ВКОШП(180 задач)
Широкое распространение в стандартных библиотеках многих языков программирования получила реализация сбалансированных деревьев на основе так называемых красно-черных деревьев. В данной задаче вам предлагается посчитать количество красно-черных деревьев заданной формы.
Напомним, что двоичным деревом называется набор вершин, организованных в виде дерева. Каждая вершина имеет не более двух детей, один из которых называется левым, а другой – правым. Как левый, так и правый ребенок, а также оба могут отсутствовать.
Если вершина Y – ребенок вершины X, то говорят, что вершина X является родителем вершины Y. У каждой вершины дерева, кроме одной, есть ровно один родитель. Единственная вершина, не имеющая родителя, называется корнем дерева.
Соединим каждую вершину, кроме корня, с ее родителем. Заметим, что для каждой вершины существует ровно один путь, ведущий в нее от корня.
Двоичное дерево называется красно-черным, если каждая его вершина раскрашена в красный либо в черный цвет, причем выполняются следующие условия:
Примеры двоичного дерева, вершины которого раскрашены в два цвета, приведены на следующем рисунке.
![]() |
Если считать закрашенные вершины черными, а незакрашенные – красными, то дерево на рисунке (а) является красно-черным деревом, а деревья на рисунках (б) и (в) – нет. Для дерева на рисунке (б) нарушается первое свойство – у красной вершины 5 родитель 2 также красный, а в дереве на рисунке (в) нарушается второе свойство – на пути от корня до вершины 1 одна черная вершина, а, например, на пути от корня до вершины 3 – две.
Для заданного двоичного дерева подсчитайте число способов раскрасить его вершины в черный и красный цвет так, чтобы оно стало красно-черным деревом.
В первой строке вводится число n – количество вершин в дереве ( 1n
1000).
Пусть вершины дерева пронумерованы числами от 1 до n. Следующие n строк содержат по два числа – для каждой вершины заданы номера ее левого и правого ребенка. Если один из детей отсутствует, то вместо его номера записан ноль. Гарантируется, что входные данные корректны, то есть набор вводимых чисел действительно задает двоичное дерево.
Выведите одно число – количество способов раскрасить вершины заданного двоичного дерева в красный и черный цвета так, чтобы оно стало красно-черным деревом.
![]() |
6 6 0 1 5 0 0 0 0 3 4 0 0
3
4 2 0 3 0 4 0 0 0
0
Напишите программу, вычисляющую остаток от деления заданного «длинного» числа на заданную цифру.
В первой строке задана цифра K (1≤K≤9). Во второй строке задано натуральное число N, состоящее из не более чем 100000 цифр.
Выведите остаток от деления N на K.
Примеры
Входные данные | Выходные данные |
5 123456789 | 4 |
1 123 | 0 |
Напишите программу, вычисляющую остаток от деления заданного «длинного» числа на заданную цифру.
В первой строке задана цифра K (1≤K≤9). Во второй строке задано натуральное число N, состоящее из не более чем 250 цифр.
Выведите остаток от деления N на K.
Примеры
Входные данные | Выходные данные |
5 123456789 | 4 |
1 123 | 0 |
Вася любит искать во всём закономерности. В его тетрадке записаны три числа A,B и C, и он хочет установить между ними какую-нибудь простую закономерность. Для начала он хочет узнать, можно ли этим числам приписать в конец несколько нулей так, чтобы сумма первых двух чисел стала равна третьему. Например, если у него записаны числа 9,34 и 43, то он может не приписывать к ним нулей сумма 9 и 34 и так равна 43. Если же у него записаны числа 23, 7 и 93, то он может приписать нуль к 7 и получить 70. После чего 23 + 70 = 93. Вам дано три натуральных числа A,B и C. Требуется найти неотрицательные целые числа n, m и k, такие что A × 10n + B × 10m = C × 10k.
На первой строке входного файла записано число A, на второй B, на третьей C. Все числа не меньше единицы и не больше 10100000.
Если числа n, m и k, удовлетворяющие условию, существует — выведите на первой строке YES, а на второй строке сами числа. Числа должны быть неотрицательными и не превосходить 106. Если решений несколько — выведите любое. Если же таких чисел не существует — выведите NO.
9 34 43
YES 0 0 0
23 7 93
YES 0 1 0
1 2 4
NO
Петя и Вася играют в очередную интересную игру. У них есть лист бумаги, на котором изображены \(n\) кружочков, помеченных числами от 1 до \(n\). Участники по очереди рисуют стрелочки, соединяющие кружочки. При этом стрелочку из кружочка a в кружочек \(b\) разрешено проводить, если выполнены два условия:
1. еще нет стрелочки из \(a\) в \(b\);
2. нельзя дойти по стрелочкам из \(b\) в \(a\).
Например, в позиции на рис. 1 можно поставить одну из трех стрелочек (рис. 2).
Проигрывает тот, кто не может сделать ход.
Петя решил написать программу, играющую в эту игру. Для этого он хочет сначала посчитать, сколько различных позиций может получиться на доске.
Входной файл содержит одно число \(n\) (1 ≤ \(n\) ≤ 100).
Выведите в выходной файл число возможных позиций без ведущих нулей.
3
25