Задачи на алгоритмы

Задачи на алгоритмы

Задачи на алгоритмы




Скачать файл - Задачи на алгоритмы


























Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. На этой неделе я начал читать бакалаврам Академического университета базовый курс по алгоритмам. Начинал я совсем с основ, и чтобы тем, кто с базовыми алгоритмами уже знаком, было чем заняться, я в начале пары сформулировал две, наверное, самые свои любимые задачки по алгоритмам. Давайте и с вами ими поделюсь. Решение одной из них даже под катом подробно расскажу. Но не отказывайте себе в удовольствии и не заглядывайте сразу под кат, а попытайтесь решить задачи самостоятельно. Обещаю, что у обеих задач есть достаточно простые решения, не подразумевающие никаких специальных знаний по алгоритмам. Это, конечно, не означает, что эти решения просто найти, но после пары один из студентов подошёл и рассказал правильное решение первой задачи. Найти любой повторяющийся элемент за время O n , не изменяя массив и не используя дополнительной памяти. Ограничение на использование дополнительной памяти означает, что нельзя заводить дополнительный массив линейной длины, но можно заводить переменные. Дана матрица nxn, содержащая попарно различные натуральные числа. Требуется найти в ней локальный минимум за время O n. Локальным минимумом матрицы называется элемент, который меньше всех своих четырёх соседей или трёх, если этот элемент лежит на границе; или двух, если это угловой элемент. Обратите внимание, что от нас требуется линейное по n время, хотя в матрице квадратичное по n число элементов. Поэтому мы предполагаем, что матрица уже считана в память. И нам нужно найти в ней локальный минимум, обратившись лишь к линейному количеству её ячеек. Ещё раз призываю вас заглядывать под кат только после того, как порешаете задачу. По второй задаче могу какую-нибудь подсказку сказать. Попытаюсь рассказать не только решение, но и то, как до него можно было бы догадаться. Пояснять буду сразу на примере. Из него, надеюсь, будет понятно, как алгоритм работает в общем случае. Добавить в закладки Метки лучше разделять запятой. Задача с таблицей решается методом градиентного спуска: За линейное время мы окажемся в каком-нибудь локальном минимуме. Если представить таблицу в виде плоскости, где числа — это высота участка, то нам надо найти в ней ямку не обязательно самую глубокую. Мы помещаем шарик в любую точку, сила тяжести катит его вниз по склону. Рано или поздно он окажется в какой-нибудь ямке. Можно придумать тест, в котором минимумов не будет вообще: Кстати, сама по себе непростая задача: Кажется, у меня есть решение, но оно O log n по памяти. Мы же просто ходим по массиву. Псевдокод лениво писать, но могу на вопросы ответить, если что-то всё же недосказанным осталось. На 3 указателя требуется 3 ячейки памяти. По сути это то же самое, что массив. Ок, вопрос, как будет вести себя алгоритм, если в массиве много хороших циклов вида: Ведь мы должны как-нибудь переходить к следующему циклу, но при этом мы никак не можем отметить, что элементы 2, 3, 4… k мы уже посмотрели. Такая переменная потребует n бит памяти. И на точку входа в цикл будет по меньшей мере две ссылки. Ок, был не прав. Я кажется понял, где произошло непонимание. После этого мы обязательно окажемся в вершине на цикле. Запомним эту вершину и будем продолжать шагать, пока не вернёмся в неё. Тем самым узнаем длину цикла k. Первым указателем сделаем k шагов. После этого будем двигать каждый из указателей на один шаг вперёд, пока они не встретятся. Вторая задача Будем ловить льва в пустыне делением её пополам. Сначала рассмотрим элементы M\\\\\\\\\\\\\\\[m,k\\\\\\\\\\\\\\\] и найдём среди них минимальный. Если он меньше обоих — локальный минимум найден. Иначе будем работать с той половиной матрицы, где лежит меньший из этих двух элементов. Если этот элемент больше a, то возьмём ту четвертинку матрицы M\\\\\\\\\\\\\\\[ Все смежные с этой четвертинкой элементы больше a. Меньший из этих элементов обозначим b. В противном случае, все элементы, соседние с четвертинкой матрицы, содержащей b, больше b, и мы снова свели задачу к вдвое меньшей, затратив O n операций. Что автоматом убивает любую оптимизацию. В условии явно сказано: Так что приведённый пример к задаче отношения не имеет. Я привел пример матрицы в которой содержатся различные числа. Этот пример соответствует условию. Ваш алгоритм не может найти дырку в столе, и к тому же некорректно описан. Вы или некорректно его себе представляете или так описываете что мне абсолютно непонятны ваши рассуждения. Попробуйте его оформить в коде. Кстати рассечение матрицы на части вводит дополнительный геморрой с рассмотрением случаев внутренних границ. Чтобы локальный минимум гарантированно существовал, нужно, чтобы элементы были попарно различными — иначе два минимальных значения можно поставить рядом, и построить вокруг них воронку из бОльших чисел. А в коде… пожалуйста. Элемент матрицы называется локальным минимумом, если он строго меньше, всех имеющихся у него соседей. В приведённом мной примере он есть. С деловым видом проползти по диагонали — не оригинально и не надёжно. Минимумы не обязаны там сидеть. Теперь с вами не поспоришь: Интересно, а есть решение у той же задачи, только если матрицу считать тором? Да точно так же: Находим на них минимальный элемент. Если он — локальный минимум, то всё нашли. Иначе рядом с ним не на границе есть элемент меньше его — и меньше всех элементов границы — а значит, на прямоугольнике N-1,N-1 , полученном после вырезания границы, локальный минимум тоже есть. И можно пойти его искать, разрезая прямоугольник на половинки. Кстати, моё решение неправильное. Можно найти контрпример размером 8х8. Но исправить решение не очень сложно. В решении первой задачи может помочь факториал. Если известно, что в массиве из N элементов числа из интервала N-1, то действовать можно так: Я также понимаю, чем плохо решение через факториал произведение быстро становится очень большим; разрядная сетка аккумулятора должна быть длиннее разрядной сетки элементов; перемножение очень больших чисел трудно называть операцией О 1 , но если всё же считать умножение целых чисел операцией O 1 , то такое решение соответствует требованиям задачи: Контрпример, на котором ваш алгоритм не найдет повторяющихся чисел: Но повторяющийся элемент другой…. Делаем обычный пузырек как то так array a\\\\\\\\\\\\\\\[ Суть задачи имхо в том чтобы правильно воспользоваться целочисленностью и диапазоном значений элементов массива. Я ничего не понял. Рискну, однако, задать несколько вопросов: А примере выше — факториал N раз делаем от N операций до 1-й операции. Но зачем все варианты по два раза проверять? Но еще раз повторюсь. Это решение не учитывает ограничения задачи, позволяющие привести решение к обходу графа. Но зато совершенно не требует дополнительной памяти кроме как два счетчика циклов: В первый раз правда натупил с границами циклов, но фиг с ним. Ох… Ещё раз, прочувствуйте разницу: Реализуются такие алгоритмы проще всего рекурсивно. В вашем случае факториал вообще был ни при чём, абсолютно. Ох… Чет я не то употребил вчерась. То A\\\\\\\\\\\\\\\[i\\\\\\\\\\\\\\\] не из диапазона Но выше уже дано написали, что ничего не получится через факториал. В общем, как все уже поняли, факториал тут не особо поможет. Это мне напомнило почему-то теорему Вильсона. Она даёт необходимое и достаточное условие того, что число простое. Но алгоритмически её трудно использовать. Это решение делает ровно те же перемещения по массиву, что и авторское. Автор, впрочем, также предложил метод нахождения описанного вами места без непосредственной перезаписи. Абсолютно с этим согласен, хотел это добавить, но подумал, что это и так очевидно для тех, кто прочел статью. Господа можете на примере например такого массива пошагово расписать как найти за О n повторяющийся элемент. Вот никак не могу сообразить. Да пожалуйста, для простоты будем считать, что нумерация массива начинается с единицы, а не с нуля, как обычно. Оставляем ее как есть. Постойте-ка, там уже записано то же самое значение, значит повтор найден. Следует отметить, что в общем случае менять элементы массива местами нужно до тех пор, пока все участники операции не встанут на свои места, или не будет найден повтор. Просто из вашего комментария не сразу было понятно что вы предлагаете менять элементы местами. Если можно модифицировать массив, и диапазон значений элементов меньше чем N, я бы предложил что-нибудь такое: Фактически вы запихали дополнительный массив, описанный в начале решения внутрь основного. Такое решение никак не может считаться решением без дополнительной памяти. Если есть повторяющиеся элементы, они в отсортированном массиве обязательно будут стоять рядом. А надо уложиться в O N. Да, вы правы, с сортировкой в ограничение по времени не уложиться, я забыл про это. QuickSort имеет оценку O N logN , но это несущественно, всё равно ни одна сортировка не имеет O N. Изначально я думал пойти по тому же пути, что предлагал kenoma , но это позволит лишь идентифицировать отдельные циклы, но это не нужно, т. Да, quicksort можно заставить гарантированно уложиться в O N log N , но тогда он будет совсем не quick — константа там такая, что он окажется медленнее, чем heapsort. И по пути придётся вспоминать, как искать медиану 7 чисел за 10 сравнений. Мы не можем уйти в стек больше, чем на O n. Кроме того, можно аккуратно раскрыть хвостовую рекурсию и гарантировать O log n для глубины стека в худшем случае. Если меняется алгоритм выбора срединного элемента, то придётся учитывать собственно расходы на поиск оптимального элемента. Когда мы делим массив на две части, то можем сначала рекурсивно вызвать qsort на более короткую часть, а вместо второго вызова организовать цикл. Если рисовать дерево рекурсивных вызовов этого решения, то получается, что вместо более длинной ветви определяется по количеству элементов в части , уходящей вниз, здесь будет цикл, уходящий вправо, а от каждого шага цикла будут свои короткие ветви вниз. Но как мы приняли решение: Тогда, например для случая: Если бы мы писали на С, то начинали бы с вершины 0. Поксорить числа от 1 до N, а потом доксорить туда содержимое массива. Останется искомое повторяющееся число. Там может повторяться больше, чем одно число. А некоторые числа могут быть пропущены. А так можно было бы просто взять сумму. Хотя пришлось бы бояться переполнений. Сумма не будет линейной O N , так как разрядность сложения нависит от N. Это как-бы намекает, что там есть все числа из диапазона потому что в условии про диапазон не сказано, сказано про числа , и только одно из них повторяется, иначе, это утверждение неверно, и автору стоит изменить условие задачи. Решение в статье считаю неверным, так как там решается другая задача и приведен пример не соответствующий условию. В условии не говорится, что каждое число от 1 до n встречается в массиве, поэтому повторяющихся элементов там может быть сколько угодно если бы все числа входили по разу, а одно — дважды, то задача была бы гораздо проще Так что менять ничего не надо. О том что говорится и что не говорится в условии должно быть написано в условии а не постфактум. Ато, сформулируют так задачу на конкурсе, потом скажут, а на самом деле мы имели ввиду это. Если N помещается в машинное слово, то сумма всех поместится в два, следовательно, суммирование будет таки — да линейным. Кстати, тоже хорошая задача. Найти xor всех чисел от 1 до N за O log N операций. В данном случае нет особого смысла, так как поиск ксора за линейное время не не влияет на сложность… А так — да. Не очень понимаю ограничение на память для первой задачи. Можно ли просто завести массив битов длиной n и проходясь по исходному массиву ставить в битовый единичку в позицию, соответствующую значению числа, если там 0, а если там 1, то записывать число в список повторяющихся значений? Дата основания 08 октября Локация Санкт-Петербург Россия Сайт spbau. Сайт кафедры МИТ mit. Интересные публикации Хабрахабр Geektimes. Астробиологи из Эдинбургского университета считают, что жизни на Марсе нет из-за токсичных химических соединений GT. За какие заслуги Kingston любят центры обработки данных? Вещи, которые мне надо было знать прежде, чем создавать систему с очередью. Обработка многократно возникающих SIGSEGV-подобных ошибок. Выбор алгоритма вычисления квантилей для распределённой системы. Как у Словакии украли национальный домен верхнего уровня. Никто не хочет сообщать Apple об уязвимостях iPhone GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.

Математические задачи - Алгоритмы

Глава 7. Алгоритмы. Алгоритмизация. Алгоритмические языки

Схема блютуз наушники h1

Газета новости радио

Алгоритмы. Задачи. 3-й класс

Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. На этой неделе я начал читать бакалаврам Академического университета базовый курс по алгоритмам. Начинал я совсем с основ, и чтобы тем, кто с базовыми алгоритмами уже знаком, было чем заняться, я в начале пары сформулировал две, наверное, самые свои любимые задачки по алгоритмам. Давайте и с вами ими поделюсь. Решение одной из них даже под катом подробно расскажу. Но не отказывайте себе в удовольствии и не заглядывайте сразу под кат, а попытайтесь решить задачи самостоятельно. Обещаю, что у обеих задач есть достаточно простые решения, не подразумевающие никаких специальных знаний по алгоритмам. Это, конечно, не означает, что эти решения просто найти, но после пары один из студентов подошёл и рассказал правильное решение первой задачи. Найти любой повторяющийся элемент за время O n , не изменяя массив и не используя дополнительной памяти. Ограничение на использование дополнительной памяти означает, что нельзя заводить дополнительный массив линейной длины, но можно заводить переменные. Дана матрица nxn, содержащая попарно различные натуральные числа. Требуется найти в ней локальный минимум за время O n. Локальным минимумом матрицы называется элемент, который меньше всех своих четырёх соседей или трёх, если этот элемент лежит на границе; или двух, если это угловой элемент. Обратите внимание, что от нас требуется линейное по n время, хотя в матрице квадратичное по n число элементов. Поэтому мы предполагаем, что матрица уже считана в память. И нам нужно найти в ней локальный минимум, обратившись лишь к линейному количеству её ячеек. Ещё раз призываю вас заглядывать под кат только после того, как порешаете задачу. По второй задаче могу какую-нибудь подсказку сказать. Попытаюсь рассказать не только решение, но и то, как до него можно было бы догадаться. Пояснять буду сразу на примере. Из него, надеюсь, будет понятно, как алгоритм работает в общем случае. Добавить в закладки Метки лучше разделять запятой. Задача с таблицей решается методом градиентного спуска: За линейное время мы окажемся в каком-нибудь локальном минимуме. Если представить таблицу в виде плоскости, где числа — это высота участка, то нам надо найти в ней ямку не обязательно самую глубокую. Мы помещаем шарик в любую точку, сила тяжести катит его вниз по склону. Рано или поздно он окажется в какой-нибудь ямке. Можно придумать тест, в котором минимумов не будет вообще: Кстати, сама по себе непростая задача: Кажется, у меня есть решение, но оно O log n по памяти. Мы же просто ходим по массиву. Псевдокод лениво писать, но могу на вопросы ответить, если что-то всё же недосказанным осталось. На 3 указателя требуется 3 ячейки памяти. По сути это то же самое, что массив. Ок, вопрос, как будет вести себя алгоритм, если в массиве много хороших циклов вида: Ведь мы должны как-нибудь переходить к следующему циклу, но при этом мы никак не можем отметить, что элементы 2, 3, 4… k мы уже посмотрели. Такая переменная потребует n бит памяти. И на точку входа в цикл будет по меньшей мере две ссылки. Ок, был не прав. Я кажется понял, где произошло непонимание. После этого мы обязательно окажемся в вершине на цикле. Запомним эту вершину и будем продолжать шагать, пока не вернёмся в неё. Тем самым узнаем длину цикла k. Первым указателем сделаем k шагов. После этого будем двигать каждый из указателей на один шаг вперёд, пока они не встретятся. Вторая задача Будем ловить льва в пустыне делением её пополам. Сначала рассмотрим элементы M\\\\\\\\\\\\\\\\\\[m,k\\\\\\\\\\\\\\\\\\] и найдём среди них минимальный. Если он меньше обоих — локальный минимум найден. Иначе будем работать с той половиной матрицы, где лежит меньший из этих двух элементов. Если этот элемент больше a, то возьмём ту четвертинку матрицы M\\\\\\\\\\\\\\\\\\[ Все смежные с этой четвертинкой элементы больше a. Меньший из этих элементов обозначим b. В противном случае, все элементы, соседние с четвертинкой матрицы, содержащей b, больше b, и мы снова свели задачу к вдвое меньшей, затратив O n операций. Что автоматом убивает любую оптимизацию. В условии явно сказано: Так что приведённый пример к задаче отношения не имеет. Я привел пример матрицы в которой содержатся различные числа. Этот пример соответствует условию. Ваш алгоритм не может найти дырку в столе, и к тому же некорректно описан. Вы или некорректно его себе представляете или так описываете что мне абсолютно непонятны ваши рассуждения. Попробуйте его оформить в коде. Кстати рассечение матрицы на части вводит дополнительный геморрой с рассмотрением случаев внутренних границ. Чтобы локальный минимум гарантированно существовал, нужно, чтобы элементы были попарно различными — иначе два минимальных значения можно поставить рядом, и построить вокруг них воронку из бОльших чисел. А в коде… пожалуйста. Элемент матрицы называется локальным минимумом, если он строго меньше, всех имеющихся у него соседей. В приведённом мной примере он есть. С деловым видом проползти по диагонали — не оригинально и не надёжно. Минимумы не обязаны там сидеть. Теперь с вами не поспоришь: Интересно, а есть решение у той же задачи, только если матрицу считать тором? Да точно так же: Находим на них минимальный элемент. Если он — локальный минимум, то всё нашли. Иначе рядом с ним не на границе есть элемент меньше его — и меньше всех элементов границы — а значит, на прямоугольнике N-1,N-1 , полученном после вырезания границы, локальный минимум тоже есть. И можно пойти его искать, разрезая прямоугольник на половинки. Кстати, моё решение неправильное. Можно найти контрпример размером 8х8. Но исправить решение не очень сложно. В решении первой задачи может помочь факториал. Если известно, что в массиве из N элементов числа из интервала N-1, то действовать можно так: Я также понимаю, чем плохо решение через факториал произведение быстро становится очень большим; разрядная сетка аккумулятора должна быть длиннее разрядной сетки элементов; перемножение очень больших чисел трудно называть операцией О 1 , но если всё же считать умножение целых чисел операцией O 1 , то такое решение соответствует требованиям задачи: Контрпример, на котором ваш алгоритм не найдет повторяющихся чисел: Но повторяющийся элемент другой…. Делаем обычный пузырек как то так array a\\\\\\\\\\\\\\\\\\[ Суть задачи имхо в том чтобы правильно воспользоваться целочисленностью и диапазоном значений элементов массива. Я ничего не понял. Рискну, однако, задать несколько вопросов: А примере выше — факториал N раз делаем от N операций до 1-й операции. Но зачем все варианты по два раза проверять? Но еще раз повторюсь. Это решение не учитывает ограничения задачи, позволяющие привести решение к обходу графа. Но зато совершенно не требует дополнительной памяти кроме как два счетчика циклов: В первый раз правда натупил с границами циклов, но фиг с ним. Ох… Ещё раз, прочувствуйте разницу: Реализуются такие алгоритмы проще всего рекурсивно. В вашем случае факториал вообще был ни при чём, абсолютно. Ох… Чет я не то употребил вчерась. То A\\\\\\\\\\\\\\\\\\[i\\\\\\\\\\\\\\\\\\] не из диапазона Но выше уже дано написали, что ничего не получится через факториал. В общем, как все уже поняли, факториал тут не особо поможет. Это мне напомнило почему-то теорему Вильсона. Она даёт необходимое и достаточное условие того, что число простое. Но алгоритмически её трудно использовать. Это решение делает ровно те же перемещения по массиву, что и авторское. Автор, впрочем, также предложил метод нахождения описанного вами места без непосредственной перезаписи. Абсолютно с этим согласен, хотел это добавить, но подумал, что это и так очевидно для тех, кто прочел статью. Господа можете на примере например такого массива пошагово расписать как найти за О n повторяющийся элемент. Вот никак не могу сообразить. Да пожалуйста, для простоты будем считать, что нумерация массива начинается с единицы, а не с нуля, как обычно. Оставляем ее как есть. Постойте-ка, там уже записано то же самое значение, значит повтор найден. Следует отметить, что в общем случае менять элементы массива местами нужно до тех пор, пока все участники операции не встанут на свои места, или не будет найден повтор. Просто из вашего комментария не сразу было понятно что вы предлагаете менять элементы местами. Если можно модифицировать массив, и диапазон значений элементов меньше чем N, я бы предложил что-нибудь такое: Фактически вы запихали дополнительный массив, описанный в начале решения внутрь основного. Такое решение никак не может считаться решением без дополнительной памяти. Если есть повторяющиеся элементы, они в отсортированном массиве обязательно будут стоять рядом. А надо уложиться в O N. Да, вы правы, с сортировкой в ограничение по времени не уложиться, я забыл про это. QuickSort имеет оценку O N logN , но это несущественно, всё равно ни одна сортировка не имеет O N. Изначально я думал пойти по тому же пути, что предлагал kenoma , но это позволит лишь идентифицировать отдельные циклы, но это не нужно, т. Да, quicksort можно заставить гарантированно уложиться в O N log N , но тогда он будет совсем не quick — константа там такая, что он окажется медленнее, чем heapsort. И по пути придётся вспоминать, как искать медиану 7 чисел за 10 сравнений. Мы не можем уйти в стек больше, чем на O n. Кроме того, можно аккуратно раскрыть хвостовую рекурсию и гарантировать O log n для глубины стека в худшем случае. Если меняется алгоритм выбора срединного элемента, то придётся учитывать собственно расходы на поиск оптимального элемента. Когда мы делим массив на две части, то можем сначала рекурсивно вызвать qsort на более короткую часть, а вместо второго вызова организовать цикл. Если рисовать дерево рекурсивных вызовов этого решения, то получается, что вместо более длинной ветви определяется по количеству элементов в части , уходящей вниз, здесь будет цикл, уходящий вправо, а от каждого шага цикла будут свои короткие ветви вниз. Но как мы приняли решение: Тогда, например для случая: Если бы мы писали на С, то начинали бы с вершины 0. Поксорить числа от 1 до N, а потом доксорить туда содержимое массива. Останется искомое повторяющееся число. Там может повторяться больше, чем одно число. А некоторые числа могут быть пропущены. А так можно было бы просто взять сумму. Хотя пришлось бы бояться переполнений. Сумма не будет линейной O N , так как разрядность сложения нависит от N. Это как-бы намекает, что там есть все числа из диапазона потому что в условии про диапазон не сказано, сказано про числа , и только одно из них повторяется, иначе, это утверждение неверно, и автору стоит изменить условие задачи. Решение в статье считаю неверным, так как там решается другая задача и приведен пример не соответствующий условию. В условии не говорится, что каждое число от 1 до n встречается в массиве, поэтому повторяющихся элементов там может быть сколько угодно если бы все числа входили по разу, а одно — дважды, то задача была бы гораздо проще Так что менять ничего не надо. О том что говорится и что не говорится в условии должно быть написано в условии а не постфактум. Ато, сформулируют так задачу на конкурсе, потом скажут, а на самом деле мы имели ввиду это. Если N помещается в машинное слово, то сумма всех поместится в два, следовательно, суммирование будет таки — да линейным. Кстати, тоже хорошая задача. Найти xor всех чисел от 1 до N за O log N операций. В данном случае нет особого смысла, так как поиск ксора за линейное время не не влияет на сложность… А так — да. Не очень понимаю ограничение на память для первой задачи. Можно ли просто завести массив битов длиной n и проходясь по исходному массиву ставить в битовый единичку в позицию, соответствующую значению числа, если там 0, а если там 1, то записывать число в список повторяющихся значений? Дата основания 08 октября Локация Санкт-Петербург Россия Сайт spbau. Сайт кафедры МИТ mit. Интересные публикации Хабрахабр Geektimes. Астробиологи из Эдинбургского университета считают, что жизни на Марсе нет из-за токсичных химических соединений GT. За какие заслуги Kingston любят центры обработки данных? Вещи, которые мне надо было знать прежде, чем создавать систему с очередью. Обработка многократно возникающих SIGSEGV-подобных ошибок. Выбор алгоритма вычисления квантилей для распределённой системы. Как у Словакии украли национальный домен верхнего уровня. Никто не хочет сообщать Apple об уязвимостях iPhone GT. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.

Куб сколько граней вершин

Архив новостей 5

Алгоритмы. Задачи. 3-й класс

Как писать пояснительное письмо в налоговую образец

Морщины и пигментные пятна

Алгоритмы. Задачи. 3-й класс

Тест драйв е

Caravan прицеп дача

Report Page