Блог пользователя Seyaua

Автор Seyaua, 14 лет назад, По-русски

Здесь приводится разбор всех задач прошедшего раунда. Вопросы и предложения задавайте в комментариях. Отдельное спасибо пользователю sdya за подготовку разборов задач D и E, которые я использовал в качестве авторского разбора.

Задача А

В данной задаче нужно уметь проверять всего четыре условия:
1) помещается ли N в тип byte

2) помещается ли N в тип short

3) помещается ли N в тип int

4) помещается ли N в тип long

Именно в таком порядке и нужно проверить эти условия. Если все они неверны – то ответ BigInteger.

Как проще всего проверить условия 1) – 4)? Проще всего хранить числа в виде строк и написать функцию сравнения двух строк как чисел. В Java можно было пользоваться встроенным типом BigInteger.

 

Задача B

Тут нужно перебрать все возможные позиции для создания искусственного дождя, посмотреть сколько в каждом из случаев получается участков, содержащих воду и выбрать среди всех возможных вариантов максимальный. При этом подсчитывать ответ для текущей позиции будем, просто расходясь вправо и влево от текущей позиции. Итоговая сложность O(N^2).


Задача C

Понятно, что максимальное число файлов и максимальное число подпапок будет в каких-то из папок, находящихся непосредственно в корне каких-то дисков. Рассмотрим, чем характеризуется файл и чем характеризуется подпапка. Файл характеризуется путем, который записан в условии, а папка характеризуется частью пути до нее. То есть, к примеру, если есть путь: C:\folder1\folder2\1.txt, то отсюда нам надо выделить две папки и один файл, чтобы получить выражение для каждой из папок в данном пути и для файла. Имеем, что первой папке соответствует путь C:\folder1\, второй папке C:\folder1\folder2\, и файлу соответствует C:\folder1\folder2\1.txt. После того, как мы разделим так каждую строку из входных данных, у нас получится набор путей к папкам и отдельно набор путей к файлам. Решим задачу сначала для подпапок. Для этого соберем все пути к папкам, которые мы получили в результате предыдущей операции. Понятно, что некоторые пути могут встречаться там несколько раз. Отсортируем этот массив. Прежде чем удалить из него повторения, заметим, что ими можно воспользоваться для подсчета ответа по файлам. Для этого просто подсчитаем какая из строк встречается больше всего раз – это и будет ответом по файлам (подумайте почему). После, нужно удалить повторения – это можно сделать, отсортировав все строки-пути и пройдя один раз по полученному массиву. Теперь у нас остался отсортированный массив путей, без повторений. Пусть наш массив будет s. Будем идти по массиву и искать строку, в которой ровно два обратных слеша – это будет означать, что мы нашли папку, которая находится в корне какого-то диска. Пусть индекс этой строки в массиве k. Тогда рассмотрим все строки, начиная с k+1 по k+l, такие, что они содержат строку s[k] как подстроку, начиная с стартовой позиции. А s[k+l+1] уже не содержит. То есть, имеется в виду, что если s[k]=X:\folder1\, то все подпапки этой папки будут иметь вид X:\folder1\... И естественно они и только они содержат s[k] как подстроку, при этом начиная с начала (выделено жирным).

Тогда, мы получим, что у папки X:<span lang="EN-US">folder1\ будет ровно l подпапок. Аналогично, пройдя так до конца массива, мы найдем ответ по максимальному количеству вложенных подпапок. Также можно было решать эту задачу используя set, или map вместо сортировки.


Задача D

Выберем N различных простых чисел: p1, p2, …, pn. Пусть A=p1*p2*...*pn. Тогда, нетрудно видеть, что в качестве ответа подходят следующие числа: A/p1, A/p2, …, A/pn. Единственный особый случай, это N=2. Здесь ответа не существует.

Следует заметить, что для такого решения этой задачи нужна длинная арифметика, при этом из операций нужно лишь умножение (A/pi=p1*…*p(i-1)*p(i+1)*…*pn). Если выбрать в качестве p1, …, pn первые n простых чисел, то самое большое из чисел в ответе на n=100, будет содержать меньше 300 знаков.

 

Однако существует еще решение. Рассмотрим ответ для N=3 – 15, 10, 6. Тогда, для произвольного N>3 подходят следующие числа: 15, 10, 6, 15*2, 15*3, …, 15*(N-2).

Задача E

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

D1=a1-b1,

D2=(a1+a2)-(b1+b2),

D3=(a1+a2+a3)-(b1+b2+b3),

Dn=(a1+a2+…+an)-(b1+b2+…+bn);

Очевидно, что если какое-то из чисел Di меньше нуля, то от первой станции машина не сможет проехать круг против часовой стрелки. Также рассмотрим число D=min(Di) – оно нам пригодится в дальнейшем решении. Очевидно, если D<0, то первая станция не может быть стартовой. Таким образом, за время O(N) мы умеем проверять, может ли первая станция быть стартовой. Покажем теперь, как проверить за O(1), может ли быть вторая станция стартовой. Для этого рассмотрим числа:

E1=D1-(a1-b1),

E2=D2-(a1-b1),

En=Dn-(a1-b1).

Распишем эти числа в более развернутом виде:

E1=(a1-b1)-(a1-b1)=0=(a2+a3+…+an+a1)-(b2+b3+…+bn+b1) – так как сумма всех ai равна сумме всех bi по условию.

E2=(a1+a2)-(b1+b2)-(a1-b1)=a2-b2

E3=(a1+a2+a3)-(b1+b2+b3)-(a1-b1)=(a2+a3)-(b2+b3)

En=(a1+a2+…+an)-(b1+b2+…+bn)-(a1-b1)=(a2+…+an)-(b2+…+bn)

Но, мы видим, что числа E1 для второй станции имеют тот же смысл, что и числа D1 для первой станции. Поэтому достаточно лишь проверить условие min(Ei)>=0. Но как это быстро проверить? У нас есть числа Di и из всех их вычитается одинаковое число => если минимум среди Di было число Dk, то среди Ei минимумом будет число Ek=Dk-(a1-b1). Таким образом, на то, чтобы проверить подходит ли в качестве ответа вторая станция – нам уже нужно O(1) операций. Аналогичным образом, зная минимум для второй станции мы проверим, подходит ли к ответу третья станция и так далее. После этого нужно не забыть решить задачу в обратном направлении, когда машина двигается по часовой стрелке.

Разбор задач Codeforces Beta Round 61 (Div. 2)
  • Проголосовать: нравится
  • +57
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится
Те кто в А юзал всякие BigInteger'ы, кажется, даже не заметили что n по условию натуральное)))
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ага:) Меня даже пытались похачить на том что я не стал проверять на то что оно меньше нуля и влазит в какой-то тип:) Правда, меня все-таки на чем-то похачили...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Зато с BigInteger-ом думать не надо. Просто кодишь и сдаешь.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Из тех решений задачи A, что я посмотрел, в большинстве так или иначе идёт проверка на знак. Лично мне было лень писать эту проверку и я просто прочитал ещё раз условие. :-)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +13 Проголосовать: не нравится
      Мне обычно наоборот, лень условие перечитывать =)))
      • 14 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Вот он, путь от серого к красному. Интересно было бы посмотреть на зависимость рейтинга от метода решения задачи A.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Один из выводов сделанных при анализе решений задач A и B: элегантность, ясность и простота решений никак не коллерируют с рейтингом и очками. У хорошо выступающих встречаются как очень красивые так и очень уродливые решения. Многие решения наводят на вопрос, а умеют ли эти программисты писать код на C или C++? (Понимаю, что в соревнованиях по программированию не оценивают код, а только результат прохождения через тесты. Но раз здесь код открыт для всеобщего обозрения, то может ввести номинации, например, на самый элегантный код, на самый уродливый код. Конечно, количественно это трудно оценить, кроме как голосованием. Возник у меня и другой, попутный вопрос. А много ли народа здесь просматривают чужие решения, кроме как для взлома?)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Ну лично я иногда смотрю, какие шаблоны используют люди и как они реализуют стандартные алгоритмы типа RMQ.
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
            Egor должен победить в первой из этих номинаций
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

>>Также можно было решать эту задачу используя set, или map вместо сортировки.

:D только на 1:27 (примерно так) допилил наконец-то этот вариант, будем надеяться пройдет.


За контест большое спасибо!

Задачи действительно увлекательные, интересные и главное для 2 дива!

Браво!

14 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
Спасибо за разбор, все как всегда намного проще (:
14 лет назад, # |
  Проголосовать: нравится +26 Проголосовать: не нравится
Когда я залочил Д и посмотрел короткое решение других участников, захотелось разрыдаться от простоты их кода.
14 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
У меня в D были числа вида 2*3, 2*5, 2*7, 2*9 и последнее 3*5*7*9. Немного проще--только одно число длинное и не нужны простые числа

Пропустил дополнительного решение. Оказывается можно вообще без длинного умножения)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В D я делала просто:
6, 12, 24...3*2^(n-2), 10, 15
и все тип-топ))
и никакой длинной арифметики))
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В задаче D придумал решение, которому хватает даже типа int. Возьмем и присвоим Ai-му значение i-ого по величине простого числа. Далее будем брать по-очереди числа и умножать их на XY, XZ, YZ (первое на первое, второе на второе, третье на третье, четвертое на первое и так далее). Здесь X, Y, Z - 51 - ое, 52 - ое и 53-ее по величине простое число соответственно. Очевидно, что все числа будут различны из-за того, что у каждого есть свой персональный прайм. Очевидно, что у каждой пары будет хотя бы один общий множитель: X, Y или Z. Очевидно, что для N > 2 встретятся все комбинации пар из X, Y, Z что приведет к тому, что НОД = 1.
Если такое решение уже кто-то писал, то извиняюсь. Читать сегодня просто сил нет, еле контест до конца досидел.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    На два комментария выше, описано решение, когда максимальное из чисел в ответе не превосходит 288 :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +7 Проголосовать: не нравится
      В моем решении максимальное из чисел не превосходит 192 :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А какие числа ты выводил?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Думается, что минимальные числа получаются из такого решения:
        6, 12, 18, 24, ....
        10, 20, 30, 40, ....
        15, 45, 75, 105, ....
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        Чувствую в D надо было спрашивать не любую последовательность а ту в которой максимум наименьший. Тогда была б повеселее задача.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Такая мысль тоже была, но ведь тогда нужно было бы доказательство правильности. Чтобы особо не усложнять задачу, было решено оставить текущую версию :)
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Как компромисс - можно было дать n побольше, или ограничение не "меньше 100 цифр", а, допустим, "меньше миллиона".

            А то у меня в решении каждое следующее число в 2 раза больше предыдущего (6, 12, 24, 48...), а многие вообще в бигинтежеры полезли.

            • 14 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
              Ну, авторам хотелось, чтобы проходили решения с длинными числами. А чем больше N, и чем больше ограничение на количество цифр, тем дольше работает чекер, который проверяет напрямую все пары и ищет НОД.
              Поэтому был выбран такой вариант, чтобы решения с длинными числами проходили без особых проблем, и чтобы самих чисел было немного.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Да уж, эта задача была бы куда веселее. я видимо не могу эту задачу решить, так как я даже не понимаю, останется ли очевидная тройка-6 10 15-в ответе. И явно решение мое которое выводило следом все числа с периодом шесть уже не катит, так как числа например 20 и 40 тоже можно будет включить.
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              Сдается мне что ответ это все числа делящиеся на любые два числа из тройки 2 3 5.

              Т.е. [6, 10, 15, 12, 18, 20, 24, 30, 36, 40, 42, 45, 48, 50, 54, 60, 66, 70, 72, 75, 78, 80, 84, 90, 96, 100, 102, 105, 108, 110, 114, 120, 126, 130, 132, 135, 138, 140, 144, 150, 156, 160, 162, 165, 168, 170, 174, 180, 186, 190]

              • 14 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
                В решении 328703 максимальное число = 182

                Я использовал числа 2*3*5, 2*3*7, 2*5*7, 3*5*7, а потом добавлял наименьшие возможные.

                Так что задача "где максимум наименьший" была бы очень злобной :)
                • 14 лет назад, # ^ |
                  Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

                  Да, я думал на тему 2 3 5 7, но этого варианта не заметил... Тогда вообще задача начинает попахивать поиском клик в графе.

                  Я попробовал найти минимум перебором, но до 24 подходит по 2 3 5 последовательность, а дальше уже подвисать начинает.

                  UPD: Можно выделить некоторый "базис", который потом домножать на все простые... Для 2 3 5 7 такой базис это [6,10,14,105]. Следующим тогда будет [6, 10, 14, 22, 1155]. Хотя, как доказывать минимальность все равно непонятно.


                                                                                                     

    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      превосходит не много,  ведь мы должны учесть, что число, на которое мы умножаем 6-ку может делиться на 5, так что наибольшее число будет  354))
14 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

Писал сегодня на хаскелле. Вторая задача не прошла тайм-лимит, хотя идея такая-же как и в разборе...

Можно-ли увидеть образцовое решение на haskell?

  • 14 лет назад, # ^ |
      Проголосовать: нравится +13 Проголосовать: не нравится
    Обычно авторы не пишут решения на Haskell. Все решения участников доступны для просмотра - попробуйте найти среди них.
14 лет назад, # |
Rev. 2   Проголосовать: нравится +9 Проголосовать: не нравится
Возьмем за базу ответ для N = 3: 6, 10, 15
А следующим числом будем ставить первое, которое удовлетворяет описанным в задаче условиям.
Т.е. для каждого кандидата просматриваем все уже поставленные числа.
Последнее число в построенной таким образом последовательности не превышает 192 для N = 50.

upd: это ответ на этот комментарий
  • 14 лет назад, # ^ |
      Проголосовать: нравится +10 Проголосовать: не нравится
    Красиво :) Авторы и тестеры до такого не додумались.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      В каком-то из предыдущих раундов (div1 + div2) была задача, где только такой принцип давал правильный ответ. Все остальные принципы давали переполнение (там надо было числа не более 1000). Я почему-то подумал, что тут такой метод неприменим... Сегодня явно не день Бекхема...
    • 14 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
      Учитывая, что даже в моей комнате минимум два человека написали решение используя тройку 6, 10, 15(у меня шла последовательность 18, 24, 30..., другой человек сделал не менее хитро-следующее число у него было 10^n), то нельзя сказать что это было неочевидное решение:)
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
ignore
не прочитал авторский разбор - значит еще не проснулся...
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Который раз встречаюсь с такой проблемой, что у меня компилятор выдает ожидаемый ответ, а на сайте в логах совершенно другой. И как то не приятно осознавать  после контеста, что дело именно в этом.
На этот раз это случилось с задачей B. Мой код. У меня на тест 1 2 результат 1. Компилятор Code::Blocks. Как надо изменить код, чтобы он зашел на сайте (если других ошибок нет)?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Там выход за границу массива происходит
14 лет назад, # |
Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
Задачу В  можно решить и за 3*N. 
Заведем 2 массива , в которых будем хранить сколько точек слева от данной мы сможем затопить и сколько справа.
  1. Проходим слева направо и смотрим сколько точек слева от нее мы можем затопить, если дождь будет над этой точкой.Считаем это таким образом: если текущая точка выше предыдущей, то мы можем затопить ее и все, которые левее от нее, а иначе мы можем затопить только ее.
  2. Аналогично проходим справа налево.
  3. Теперь проходим по полученным массивам и в ответ присвоим максимальную сумму соответствующих элементов массивов - 1, так как мы текущую точку посчитали 2 раза.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    Ну а почему бы не решить задачу за один проход? Пройдемся по массиву слева направо. На каждом шаге будем поддерживать указатель на самую близкую слева позицию (включая текущую), которая ниже предыдущей. Это делается одним if'ом. Будем так же поддерживать указатель на самую ближнюю справа позицию (опять же включая текущую), которая ниже последующей. За весь проход по массиву этот указатель так же побывает на каждом элементе по разу. Итого: один проход и количество итераций 2N. 
    • 14 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится
      Я делал за два прохода: сначала вперед, если предыдущая была ниже-делал следующую как предыдущую+1, вторым проходом плелся по массиву назад и делал предыдущую как следующую+1 в аналогичном случае, ну и ответ собственно понятен-l+r+1. Ассимптотически так же, но с указателями вообще можно не париться. 
14 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
А не -1 ? Вроде как по логике должен отнять.Либо я немного запутался.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Все-таки есть что-то неправильное в том, что задача А (ключевое слово - "А") на С++ писалась довольно-таки долго (и с кучей ошибок), а на других языках за минуту-две. 

Были бы задачи, скажем, D,E с длинными числами/арифметикой - тогда да, выбор языка не давал бы такого большого преимущества. А здесь кто-то потратил 4 минуты, кто-то 20 и больше.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Почему долго? Можно было строки сравнивать, там и нетрудно и быстро
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На С++ А пишется быстро. Если заметить в условии, что числа натуральные, и знать про тип unsigned long long. Длинка не нужна.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      Да разницы нет на самом деле. Дополнительная переменная и один ифик уже обобщают решение даже на отрицательные числа. Суть в том, что писать все равно больше, чем на некоторых других языках.
      Вообще, интересная ситуация: всегда найдутся те, кому чем-то не понравится задача A :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Для "Красных" эта задача, конечно же, не представляет никакой сложности.
        Но для второго дивизиона (не забывайте, некоторые могут принимать участие в первый или второй раз) разница между решением на с++ и 4-мя условиями на, допустим, Ruby, довольно-таки большая. 

        И, кроме этого, не забываем про взломы. Взламывать решения на языках с поддержкой длинных чисел смысла не было (особенно с хм.. "нативной", как Ruby) смысла не было, в то время как с++... =)
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Да, согласен задача А для 2 дивизиона желательна быть совсем простой чтобы каждый мог решить независимо на каком языке пишет
          Вспомните себя, когда начинали. А то пишут "всякие красные да оранжевые" , что просто сравнить числа как строки или заметить что 19 значные числа можно сравнивать в беззнаковом лонге))
14 лет назад, # |
Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится
Почему у меня на компьютере в задаче B
В тесте 2: 
5
1 2 1 2 1, ответ: 3.
А на сервере пишет что у меня ответ на эту задачу 1?
Писал на Delphi.
  • 14 лет назад, # ^ |
    Rev. 15   Проголосовать: нравится 0 Проголосовать: не нравится
    А проверка выхода за границы массива включена?

    З.Ы. Как тут блин бакс обычный в сообщение вставить?
    • 14 лет назад, # ^ |
      Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится
      Так если бы за границы вышел бы массив, ответ был бы RunTime error?
      Тем более у меня на компе тот же самый код, нормально ответ показывает 3.

      p.s. глянь в личку
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        Чтобы был рантайм надо опцию компилятору дать. А без нее результат непредсказуем.
      • 14 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
        У меня на FPC ваше решение тоже выдает 1. Используйте read() вместо readln().
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          а когда вы у себя в моем коде readln меняете на  read, выдает 3?
          • 14 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
            В любом случае, когда в компиляторе(который на сайте), вставляю свой код и запускаю, выводит ответ 3.
            Язык там ставил и FP и Delphi, все равно ответ 3.
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              Решение с read() вместо readln() проходит все претесты.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +6 Проголосовать: не нравится

      \texttt{\$}

      :)


14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Спасибо за контест, задачи понравились, в особенности Е. Надо будет дорешать)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Elegant solutions!
In particular, problem E!!
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
problem E!
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Will problem C be published?
»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

My solution to B is O(n).Unfortunately I can't see my code, but I think the run-time error will be something trivial.

»
8 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

What is test case 14 for problem C? I tried to simulate the file system yet it ended up in a RE.

http://codeforces.me/contest/66/submission/19224146

»
8 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

well...I don't need it myself but, problem C's Editorial has been delayed for 6 years...

»
7 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

For whoever is interested, here is an outstanding and creative approach taught to me by IOI silver medalist, ICPC world Finalist and my teacher razimantv to problem D. It does not require big integers and teaches an important fact about binary numbers.

First, let us consider all the numbers (from 1 to N) in binary.

For each bit position, associate two primes — P[i], Q[i]. Multiply all numbers which have the i-th bit set by P[i]. Multiply all numbers which have the i-th bit unset by Q[i].

Now, all pairs of numbers which have a common bit set have a common factor. We only have to deal with those numbers which don't have any common bit (i.e. ... Those numbers who's XOR gives a string of all 1s).

We give all pairs of numbers (i, X) a common prime factor if i^X gives a string of all 1s.

Now, we have ensured that any two numbers have a common prime factor and no prime divides all numbers, We are done !

Here is code for this approach and here is some explanation.

(Here's the same code on GitHub)

»
7 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

In case, anybody requires more explanation for Problem D, I have written a post about it here.

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

My solution for D is like this:

  • First element will always be $$$2\times3$$$ and fill $$$n/2$$$ elements with $$$2$$$ while fill remaining elements with $$$3$$$. It will ensure that $$$n/2$$$ and $$$n-n/2$$$ groups have pairwise $$$gcd>1$$$ inside their groups. This also means that $$$gcd$$$ of all elements is $$$1$$$.

  • Now for every element from $$$2$$$ to $$$n$$$ multiply it by 5. This ensures that each pair has $$$gcd>1$$$.

  • Now for elements to be distinct, multiply elements with unique prime numbers.

Note: It will not work for $$$n=3$$$.

Solution link

»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone suggest how to deal with the overflow in C++? Long long is not sufficient for storing the answer and trying to perform multiplication with strings is very complex.