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

Автор brainail, 14 лет назад, перевод, По-русски
Приветствую всех на Codeforces Beta Round #17, который состоится 10-го июня (четверг) 2010, 19:00 (UTC +4, Московское время). Этот контест буду представлять я. 
Хочется сказать отдельное спасибо Михаилу Мирзаянову, который сделал проведение контеста возможным, Артёма Рахова за помощь в тестировании авторских решений и Юлии Сатушиной за качественный перевод задач на английский. Большое спасибо Гене Короткевичу за составление условий, написание авторских решений и красивых идей. Надеюсь, задачи вам понравятся.

Желаю чтобы число 17 оказалось для вас интересным!

Обсуждение задач предлагаю проводить здесь в комментариях после конца контеста.

UPD: Контест закончился, всем спасибо за участие!
UPD: 



  • Проголосовать: нравится
  • +31
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится
Ни в коем случае не оставляй какую-либо тему пустой - яйцами закидают.
Лучше оставь перекрёстные ссылки на темы с подписью:
Просьба отписываться тут (ссылка) Просьба отписываться тут (ссылка) ...
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
:) Да всё ок, просто пост создался два раза о_о я вообще не доумеваю как ;) Все фичи поправятся, не переживайте ^_^ Регайтесь на контест главное во время :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Регайтесь и обязательно проверяйте, что вы есть в списке зарегистрированных!
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Наверное одну из тем лучше почистить (лучше сейчас прям), или пустить в расход, например, под обсуждение задач.
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Я правильно понял, что автором задач и решений по сути выступает Гена Коротевич?

Тогда сразу вопрос - почему автор контеста не он, а Вы? Он на столько скромный ? :)

  • 14 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    Насколько я понял, brainail придумал идеи задачи, а Гена Короткевич сформулировал и написал конечные условия, т.е. "сказку", "присказку", описал формат ввода/вывода и т.п.

    Но возможно я слишком оптимистичен, и brainail всего лишь представляет контест, хотя это было бы странным.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +7 Проголосовать: не нравится
      Я скорее выступаю соавтором этого контеста. Идеи задач и решений правильнее было бы назвать общими, а я написал перекрёстные решения и помог написать условия задач.
14 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится
Товарищи меньше думаем :) На контесте вам нужно думать, а тут не надо! ^_^
Идеи некоторые задачи не мои, но это не меняет суть дела :) Ваша задача решить все задачи!! На что желаю вам удачи =) 
  • 14 лет назад, # ^ |
      Проголосовать: нравится +16 Проголосовать: не нравится
    Люди с программистским складом ума могут быть несовместимы с тем, чтобы в какие-то моменты не думать ;) .
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Is the link to number 17's page on wikipedia some kind of a hint on the type of problems for today's match? :P Prime numbers???
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
It is very disgusting. I have registered for the event and solved the problem but when I am submitting the solution it is saying "You should have registered". And there is no admin available to contact..
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    You can contact admin by his profile
    http://codeforces.net/profile/MikeMirzayanov
    There you can send a personal message if you want, ofc.
    Also, there were a link on the contest page to publish a question.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
How Problem B can be solved?

using map in c++?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I've solved it using topsort, and then we must going from bottom to top and get the edges with minimal cost.
    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        No it isn't. Test 1 provides a counterexample.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          I did Kruskal and it was fine :P
        • 14 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          It seems to me that certain problems have a time limit that's too strict for Java. The same code in C/C++ works, while Java gives a TLE. Can we have extra time for Java solutions and for other slower languages?
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        what about this?

        3

        3 2 1
        3
        1 2 400
        1 3 100
        2 3 100

        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          I forgot to say that we mustn't allow situation, when anybody has more than 1 supervisor. It's little difference between Kruskal's algorithm and this problem.
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            How do you handle that? I was going to write

            3
            3 2 1
            3
            1 2 400
            1 3 200
            2 3 100

            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              I think, this algorithm is valid for this example.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                In case above Kruskal takes edges with weights 100 and 200, resp. so node 3 has 2 supervisors, and the correct answer is 600
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  well, I have used Kruskal in contest time and a greedy approach later. I only assured that no node has indegree greater than 1 when i used Kruskal. And for the above case, the correct output should be 500.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  I write above, that we will not allow such situations. If I said it incorrectly, please, sorry for my English.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  I solved it using the idea of kruskal but with little modification.  I pick the smallest non-supervised  node. In your case, 1st you pick "2 3 100", now par[3]=2;. next minimum cost is "1 3 200" but par[3] is not -1 so just continue and don't pick it up. Next cost is "1 2 400". Since par[2]=-1 then pick it and update it's parent. Total cost is 200+400=600
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Well, then why not Prim's? :P
        I think it should do better with Prim's.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          You're not trying to compute an MST. A simple counterexample has edges with weight 1 all connecting to one vertex; what happens is you want all but one vertex to have an ancestor. The MST that you find will violate the above condition.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится
    Simple greedy: for each employee i, we assign to the employee j if q[j] > q[i] and the cost is min (i.e. pick the smallest possible cost).
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      It can be easier..
      The problem assure us that the input is well formed (q[j]>q[i]). So we don't need to process the q value and the name of the employee that made the offer.
      At the end we only need to check if at most one employee is without a boss.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    This is making Minimum Directed Spanning Tree out of a DAG. It can be solved in O(n+m) time, just remember the cheapest supervisor for each employee.
14 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Nice problem set!. Any hints on how to solve C? =)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    N^4 - dynamic programming. It turns out that it's enough to fit the TL :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Thank you e-maxx =)
      For some reason during all the contest I thought that the string could contain any characters from 'a' to 'z' . I just realized that the only allowed characters are 'a','b' and 'c' =(
      I will try to solve it using DP as you suggested =)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
У кого-нибудь было WA 18 в D ? Не знаю, что не так. Есть какие-нибудь особенности у этого теста?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    У меня был WA 18, но точно не помню, в чем была проблема. Проверь, что все остатки неотрицательные, и что переполнения нигде нет. У меня в основном в этом были баги.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ох, когда считал b % с, умножал b на 10, поэтому могло переполниться. Спасибо.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    В 18 тест нет ничего сложного, наверно у вас какой-то баг.
    713030357739784847 61197710123555584 999992531
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    У меня был ронг на тесте 18. Поменял все на 64-битный тип и получил законный тайм лимит на тесте 28:-)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Неужели задача D решалась через быстрое возведение в степень. Если так то очень обидно что решение на Java, с единственной операцией деления по модулю большого числа не проходила.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Мне кажется, там что-то более умное на теорию чисел, но увы я не решил. Т.к. все сданные решения работают за очень малое время. А возведение в степень, даже на С, дает TL.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится
    Ну да, через возведение, но только не длинных чисел, а чисел <= C :)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +17 Проголосовать: не нравится

      a^b % c == (a % c) ^ (b  % phi(c)) % c

      где phi(c) - функция Эйлера.


      Правда, есть одна тонкость - если a^b %c = 0, то этот метод может спалиться (даст не ноль). Можно понять, что это происходит, когда (a % c) ^ (phi(c)) = 0 и b >= phi(c). Поэтому в случае b >= phi(c) надо ещё взять (a % c) ^ (phi(c)) и посмотреть, не ноль ли он. Ну или может есть какой-то другой хак, не знаю.

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это же не работает, если a и c не взаимно просты
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          It can be patched to work in that case. First, decompose c in it's factors, p1^e1 * p2^e2 * ... Then solve for each pi^ei independently and get the final result by merging all individual results using the Chinese Remainder Theorem.

          Let mod = p^k, and tot = p^k - p^(k-1). To solve the equation (a^b) % mod is equivalent to solve ((a%mod) ^ (b%tot)) % mod, except when a is divisible by prime p.

          To patch this is easier. Count how many times p can divide a, let call this number x. Then, in a^b the prime p will appear exactly x*b times. If x*b >= k, return 0, otherwise, there are not enough primes to make the mod 0, so just do the normal thing.

          Here is the relevant snippet with this part: http://ideone.com/goy8b
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Actually, I've looked at e-maxx's code, and he did something similar to what ivan.popelyshev proposed down this thread. So it was just wrong wording, I guess.

            P.S. Do you know Russian or you use Google translate? :)
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              It's similar to his first proposal, I decomposed C completely while he only checked the necessary factors.

              PS: No, I would like to know Russian, but I cheated and used Google Translate.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +18 Проголосовать: не нравится
    Логично что оно не проходило, перевод числа из десятичного в двоичное в яве работает за квадрат от длины. Надо было реализовывать возведение в степень без этого перевода, такое решение проходит
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А, или проблема даже была в a % c ? Жесть :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А, или проблема даже была в a % c ? Жесть :)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А что, Java может прочитать 106-значное число в BigInteger меньше, чем за две секунды? Для этого нужен какой-то специальный десятичный BigInteger?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    В этой задаче можно обойтись без теории чисел вообще. Жалко что придумал где-то после 8 или 9 сабмита издевательства над функцией эйлера)

    Решить можно так. Первое число можно взять по модулю из-за этого ничего плохого не произойдет точно. На (a-1) можно умножить в конце. Основная сложность с подсчетом a^(b-1). Для этого можно вычесть из b 1 как из длинного числа. А потом пройтись по разрядам начиная от старшего и сделать что-то такое ans=((ans^10)*(a^b[i]))%c. Тогда и взаимная простота значение потеряет и в принципе никаких случаев.
14 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится
Thank you brainail, thank you tourist! It was really good contest!
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
So, how was D solved?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    I've solved it in the following way.
    If n is quite small (say, less than 5 digits), then you can simply calculate
    bn - 1(b - 1) modulo c.
    Otherwise, let c = c1c2 with c1 and c2 coprime, and c1 consisting of primes dividing b. Then bn - 1 = 0(modc1) (because n-1 is very large), and bn - 1 = b(n - 1)modφ(c2)(modc2) (because b and c2 are coprime).
    And if we know the remainders modulo c1 and c2, then we can calculate the remainder modulo c, using the GCD representation kc1 + lc2 = 1.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится
    Use identity b^(10*x+y) = (b^10)^x * b^y
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    I have a "solution"  which use fast exponentiation and it has TLE.
    Instead of dividing the bignum by 2 directly I multiply it by 5 and divide it by 10, and just keep a variable to point the first number before the decimal point.

    let n = 10^k,

    my solution is O(klogk) and k is at most 1 million. Most problemas I've done it's enough to pass.

    So can someone please explain the problem with this approach? Or the idea it was intented to pass and the implementation was bad?

    Thank you in advance.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      I tried this too, but where it fails is that if N is d digits long, then to arrive at zero by iteratively dividing by a constant number, you will need to divide O(d) times. Every division takes O(d) time to execute since you're touching all digits (this value goes down as N shrinks of course, but not fast enough to make a difference for the complexity analysis.)

      So in the end you have an O(d2) algorithm which is too slow when d~106 as in this problem.
14 лет назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
Разбор будет :) И там будет очень много интересного и полезного! :)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А можно спросить в задаче B квалификация у всех разная? Просто мое решение я думаю не прошло бы если бы возможно была бы квалификация равная у нескольких сотрудников (особенно если бы они это начальники без начальников, т.е. с максимальной квалификацией)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    квалификация там по-моему лишняя
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Yes.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Почему лишняя? Можно отсортировать всех по убыванию квалификации и последовательно искать им начальников.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
        Нам гарантируется выполнение условия, поэтому квалификация неважна нам. Каждому ищем начальника и минимальной стоимостью. Если мы всем, кроме одного, смогли найти начальников, то построена иерархия, ибо из условия следует отсутствие циклов.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да видимо запарил, контртеста не придумал
      а квалификацию я использовал для определения главного начальника=)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Квалификация могла быть одинакова, но в условии оговорено то что квалификация сотрудника A всегда строго больше квалификации сотрудника B.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
damm, the number of divisions is log(10^k) not log(k) =\, stupid mistake, thank you for replying.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Why is the task of E so little decided? and C? =)
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

К сожалению прпоустил контест (проснулся за три минуты до начала. регистрация была закрыта :о( )
Почитал задачи. Очень понравились D и E, особенно Е - действительно клевые задачи. Не понравилась С :о)

Опять же, поощрительные должны быть проще :о)

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

Недавно я изучал решение одного очень уважаемого программиста задачи Е с этого контеста и случайно обратил внимание на 45-й тест:

Казалось бы, что в этом такого? Но вот если загуглить число 731, то можно обнаружить ссылки на японский нацистский концлагерь! Таким образом, автор тестов явно хотел вставить оскорбление светлой даты победы "1945" этим гнусным числом.

В какой-то другой день, я, возможно, не стал бы обращать на это внимание, но сегодня день особенный и я не мог просто пройти мимо. Мне кажется, что автора контеста нужно, как минимум, дисквалифицировать навеки, а как максимум — полностью откатить результаты контеста, чтобы преступление пятилетней данности никому не сошло с рук. Как думаете вы, завсегдатаи ресурса?