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

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

Сегодня (10.12.11) в 12:00 MSK  состоится вторая индивидуальная олимпиада на neerc. Всем удачи!

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

12 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится
Олимпиада началась.
Не забудьте принять участие :)
Можно регистрироваться во время олимпиады - новые участники будут добавлены несколько раз в течении олимпиады. Поскольку на личных олимпиадах нет штрафного времени, это не страшно - просто решайте задачи! :)
  • 12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А где же всяческие токены?
    • 12 лет назад, # ^ |
        Проголосовать: нравится -8 Проголосовать: не нравится
      С токенами тут абсолютов штук 15 будет :)
    • 12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ближайшая серьезная олимпиада, к которой все готовятся - региональная и на ней нет токенов.
      Ближе к РОИ они появятся и в интернет-олимпиадах.
      • 12 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится
        Что такое токены?
        • 12 лет назад, # ^ |
            Проголосовать: нравится +4 Проголосовать: не нравится
          вроде это когда можно смотреть свой балл по задаче.... или я ошибаюсь
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Только меня не система не пускает?
УПД: теперь всё ок.

12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как решается последняя задача Наименьшее общее кратное?
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

Кто как делал Д?
У меня упадет по времени когда много разных множителей в факторизации.

ПС. Я делал ДП по маскам + метод включения/выключения. Вышло О(3^p*K^2), где p - кол-во различных простых множителей в числе N.

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

    Я тоже делал дп по маскам, но за divs*k^2*2^p, где divs - число делителей n. p - то же, что и у вас. dp[divisor][mask][count]. divisor - номер текущего делителя. mask - маска покрытых классов эквивалентности простых множителей. Покрытым класс называется тогда, когда мы включили в набор число, в разложение которого данное простое число входит в той же степени, что и в n. count - количество чисел в наборе. Считается число способов добиться состояния mask-count использовав первые divisor делителей. Тогда ответом будет dp[divs][2^p-1][k]. Переходы простые - мы можем добавить текущий множитель несколько раз.

12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как решать D?
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как решать С??
  • 12 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Что то наподобие решета эратосфена. Вся фишка в маленьком N.
    http://ideone.com/2oJMO
  • 12 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Отсортируем все ai.
    Затем запустим "решето эратосфена" на этих числах:
    1) заполним массив чисел единичками
    2) идем от 1 до k: если это число ai в массиве все еще единичка, то запустим просеивание (как в решете). всем числам, кратным данному ai присвоим 0.
    3) посчитаем количество единичек в массиве - это и будет ответом.

    • 12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А я впопыхах ничего проще метода включений-исключений не придумал и радостно сдал его на 25 баллов)
  • 12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

    Неожиданно, но зашло решение за О(n*sqrt(n)). Просто идем от 1 до n, смотрим на делители числа, если хоть один делитель есть в нашем наборе, прибавляем к ответу, идем дальше.

  • 12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Т.к. N маленькое то можно хранить булевский массив и вычеркивать числа влоб. Почему это быстро? Потому что вычеркивая все числа кратные a[i] мы потратим N / a[i] действий и понятно что худшим вариантом будет когда a[i] достаточно маленькие. Но если избавиться от повторяющихся a[i] (понятно по каким соображениям), то самым худшим вариантом будет последовательность рода N / 2, N / 3 ... N / K. Как известно такая последовательность сходится к N ln N, что вполне удовлетворяет =)
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Условие в задаче А - ужас, ничего почти непонятно.
Наверное, поэтому у многих 64 за нее.
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
D была бы интереснее с N = 10^18 :)
  • 12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    как ее вообще решать?
    • 12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Научимся считать f(i, j) - количество разных наборов из i чисел, при том, что можно выбирать числа в набор из j различных. Это считается простой дп-шкой. Теперь заметим, что в наборах могут быть только делители числа N. Еще заметим, что их будет немного(меньше 10000) и то что количество различных простых делителей числа невелико (для N<=10^12) максимум 11. Надо просто найти степени всех простых делителей N. Потом можно за 2^11 делать включения-исключения по простым делителям. Код тут.
  • 12 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    я бы не сказал, что она была неинтересна
  • 12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Для N ≤ 1018 все решалось бы также, только нужно было бы уметь факторизовать быстро.
    • 12 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Быстро факторизовать не требуется, достаточно только знать степени с которыми простые входят в число.
      • 12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Да, ты прав :) Я не подумал о том, что степени-то мы можем узнать до 1018. Действительно интересней.
  • 12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Также можно было сделать k ≤ 105, но подумал, что и так непросто будет для многих:)
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Результаты уже доступны в PCMS2.
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Какая типичная (ее допустили много участников) ошибка может быть в B?
12 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

я решал Д так:

ну во-первых заметим, что в наборах будут участвовать только делители N (это нетрудно доказать)

далее: посчитаем не то что просится в задаче, а сколько наборов из k элементов у которых НОК != N и отнимем от общего числа наборов - это и будет ответом.

общее число наборов С(k, количество делителей + k - 1) (сочетание с повторениями) 

как посчитать количество наборов у которых НОК != N? ну очевидно, что НОК какого-то набора равен N, тогда и только тогда, когда для каждого простого множителя N найдется число в наборе, в котором степень этого простого числа такая же, как в N. теперь понятно, что набор имеет НОК != N, когда не будет выполняться это условие для какого-то простого числа... 

то есть посмотрим какие делители числа надо убрать из набора, чтобы в нем не осталось ни одного делителя, делящегося на степень этого числа так для каждого простого множиетля, ну очевидно, что будут делители делящиеся на степень каких то 2х простых множителей, 3х, 4х... и т.д. то есть нужна будет формула включения-исключения... ну еще конечно понадобиться деление по модулю, для вычисление С-шек.... как то так

вот код

12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Результаты и материалы опубликованы.
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Скриншот верхней части результатов:


12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Хотелось-бы узнать почему у меня С набрала 90 баллов. Прогнал локально , то все тесты прошла правильно и быстро.