Турнир Архимеда(52 задач)
Кировские командные турниры(8 задач)
Барнаульские командные турниры(10 задач)
Московская командная олимпиада(246 задач)
Командные чемпионаты школьников Санкт-Петербурга по программированию(167 задач)
ВКОШП(180 задач)
У доброжелательного Даниила есть несколько яблок. В силу своей природной доброжелательности, каждый раз, когда он встречает какого-либо своего друга, он смотрит на яблоки, которые у него есть и отдает другу половину.
Но Даниил не одинаково любит всех своих друзей, поэтому некоторым из них он отдает половину яблока, а некоторым — половину имеющихся у него яблок. При этом с глазомером у Даниила не так хорошо, как со щедростью, и делить яблоки более, чем на две части, у него не получается. Поэтому, если он встречает друга, а у него нецелое число яблок, то он вынужден отдать половину яблока.
Утром у Даниила было \(n\) яблок, а за день Даниил встретил \(k\) друзей. Выясните, сколько яблок у него могло остаться вечером.
Входной файл содержит два целых числа: \(n\) — количество яблок у Даниила и \(k\) — количество
встреченных им за день друзей
\((1 \le n \le 1000, 1 \le k \le 1000)\).
Первая строка выходного файла должна содержать число \(m\) — количество вариантов ответа на вопрос, сколько яблок может быть у Даниила вечером. Следующая строка должна содержать m вещественных чисел, отсортированных по возрастанию — варианты ответов.
6 1
2 3.0 5.5
Во многих языках программирования есть функции, которые отвечают за заполнение всего массива или некоторой его части определенным значением. В языке Pascal это функция fillchar(), в Java — Arrays.fill(), в C++ — memset(). В новом языке программирования J# появилась функция mark(), которая умеет работать только с массивами логического типа.
Функция mark, вызванная от двух параметров \(a\) и \(b\), присваивает всем элементам массива с индексами от \(a\) до \(b\) включительно значение true, Так, если взять массив длины \(4\), элементы которого нумеруются с единицы и все значения в котором изначально равны false, и выполнить с ним операции mark(1, 3) и mark(2, 4), то весь массив окажется заполнен значениями true.
Одним из первых заданий для тех, кто начинает изучать J#, является написание программы, содержащей ровно \(M\) операций mark, и полностью заполняющей значениями true массив длины \(N\), изначально заполненный значениями false.
Вы быстро справились с этим заданием, и теперь задумались: сколькими различными способами это можно сделать? Различными считаются такие способы, в которых \(i\)-я операция mark в двух программах запущена с разными параметрами хотя бы для одного \(i\) от \(1\) до \(M\). Это число может быть большим, поэтому требуется посчитать его по модулю \(10^9 + 7\).
В первой строке входного файла даны два натуральных числа \(N\) и \(M\) — длина массива и количество операций mark, которые должны быть в программе. (\(1 \le N, \ M \le 70\)).
В единственной строке выходного файла выведите остаток от деления числа способов заполнить массив из \(N\) элементов значениями true с помощью \(M\) вызовов операции mark на число \(10^9+7\).
Искомые варианты:
• mark(1, 1); mark(1, 2)
• mark(1, 1); mark(2, 2)
• mark(1, 2); mark(1, 1)
• mark(1, 2); mark(1, 2)
• mark(1, 2); mark(2, 2)
• mark(2, 2); mark(1, 1)
• mark(2, 2); mark(1, 2)
2 2
7
В новых процессорах, проектируемых корпорацией MBI, для работы со строками выделен отдельный сопроцессор. Этому сопроцессору можно передать строку, состоящую из строчных символов латинского алфавита, и программу, описывающую обработку строки. После этого процессор задумается и, через долю секунды, вернет результат обработки строки.
Работа еще не завершена, поэтому пока что он умеет обрабатывать строки только одним способом. Строка, которую ему передают на ввод, должна состоять из \(2^k\) символов, а программа обработки этой строки — из \(2^k \ − \ 1\) чисел, каждое из которых является нулем или единицей.
Если строка, поданная на вход сопроцессору, состоит из одного символа, то результат обработки равен этой же строке. Если строка длиннее, то выполняются следующие действия.
Сначала он разобьет строку на две части равной длины, а программу — на три части. При этом длины первых двух частей программы будут равны между собой, а третьей частью будет последнее число программы. После этого первая половина строки превратится в результат ее обработки первой частью программы, а вторая — в результат ее обработки второй частью программы. После этого, если оставшееся число равно нулю, вторая половина строки будет дописана справа к первой, если же оно равно единице — первая половина будет дописана справа ко второй.
Так, например, если на вход сопроцессору подана строка «abcd» и программа (0, 1, 1), то результатом обработки будет строка «dcab».
Вам поступило предложение принять участие в его тестировании. Отказаться от такого лестного предложения вы не смогли, поэтому теперь вам необходимо научиться составлять программу для сопроцессора, с помощью которой он преобразует строку \(S\) в строку \(T\), или же определять, что такой программы не существует.
Первая строка входного файла содержит одно целое число \(n\) — количество случаев, которые вам необходимо разобрать. В следующих строках описаны сами \(n\) случаев.
Первая строка описания очередного случая содержит строку \(S\), состоящую только из строчных букв латинского алфавита. Длина строки \(S\) равна \(2^k\) , где \(1 \le k \le 16\). Вторая строка описания очередного случая содержит строку \(T\), также состоящую только из строчных букв латинского алфавита. Длина строки \(T\) равна длине строки \(S\).
Суммарная длина всех строк \(S\) в одном входном файле не превышает \(100 000\).
Для каждого случая в очередной строке выходного файла слово «Yes», если программа для сопроцессора, преобразовывающая строку \(S\) в строку \(T\) существует, и «No» в противном случае.
Если ответ «Yes», в следующей строке выведите \(2^k \ − \ 1\) чисел, разделенных пробелами — программу, которую для этого преобразования необходимо передать сопроцессору. Если таких программ несколько — выведите любую.
2 abacabab baababca abacabab bbaaabca
Yes 0 1 0 1 0 0 1 No
На прошлом уроке английского Пете задали домашнее задание. Оно заключалось в разгадывании ребусов. Каждый ребус — это последовательность картинок. С двух сторон от каждой картинки могут располагаться апострофы. Каждая картинка обозначает некоторое слово. Предположим, что перед некоторой картинкой нарисовано \(i\) апострофов, а после нее \(j\) апострофов. Это значит, что у слова, которое сопоставляется картинке, необходимо убрать \(i\) букв с начала и \(j\) с конца, а оставшуюся его часть записать вместо картинки и апострофов. Так необходимо сделать с каждой картинкой и окружающими ее апострофами. После этого нужно «склеить» получившиеся кусочки в одно слово. Оно и будет разгадкой ребуса.
У Пети нет проблем с тем, чтобы сопоставить каждой картинке слово. Но ему очень лень заниматься отбрасыванием лишних букв и склеиванием слов. Поэтому он попросил вас помочь ему. Дана строка, которая состоит из маленьких латинских букв, апострофов (символов с кодом 39), а также пробелов, которые разделяют слова. Апостроф относиться к некоторому слову, если между ними нет пробела. Если апостроф стоит слева от слова, то у него необходимо убрать одну букву с начала, если справа — с конца. Потом необходимо склеить все слова в одно.
Например, пусть дана строчка «team ’ ’ ’ ’ school ’ ’ olympiad’ ’ ’». В первом слове ничего изменять не надо, так как к нему не относится ни один апостроф. Во втором необходимо убрать первые четыре буквы и получить «ol», из третьего слова получится «ymp». После скеливания трех кусочков получим строку «teamolymp».
В первой строке входного файла дан ребус, длиной не более 100 символов, который необходимо решить. Гарантируется, что в строчке присутствуют только апострофы (код символа — 39), пробелы и маленькие латинские буквы, а также, что ребус корректен — нет слова, у которого нtобходимо удалить букв больше, чем его длина.
Выведите одно слово — ответ на ребус.
team ''''school ''olympiad'''
teamolymp
Каждый год профессор Иванов ездит в Африку с целью изучить племена, которые там проживают. В этом году он ездил в гости к племени тив. Профессор довольно быстро научился понимать их язык, выучил многие их обряды, однако, он никак не мог понять записанные цифрами тив числа. Как и мы, члены племени используют позиционную систему счисления с основанием 10. Но цифры в племени тив обозначают символами, не похожими на обычные цифры от 0 до 9.
Профессор обозначил эти символы буквами от ‘a’ до ‘j’, но не может понять, какой цифре соответствует какой символ. Тогда вождь племени дал ему список из n неотрицательных чисел, записанных без ведущих нулей, и сказал, что числа в нем отсортированы строго по возрастанию.
Помогите профессору восстановить по этому списку какое-нибудь соответствие символов цифрам.
В первой строке входного файла дано одно натуральное числа \(n \ (2 \le n \le 10)\) — количество слов в списке. Следующие \(n\) строк содержат выданные вождем числа племени тив, по одному числу в строке. Длина каждого числа не превышает \(9\).
В первой строке файла выведите «Yes», если ответ существует, в этом случае в следующей строке выведите цифры, которые соответствуют символам, обозначенным ‘a’..‘j’, в этом порядке. Если существует несколько ответов, то выведете любой из них.
Если профессор понял что-то неправильно, и ответа не существует, выведете «No».
4 a da dd cc
Yes 0 1 3 2 4 5 6 7 8 9
4 a j jb ac
No