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

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

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

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

15 лет назад, скрыть # |
 
Проголосовать: нравится +14 Проголосовать: не нравится
Олимпиада началась.
Не забудьте принять участие :)
Можно регистрироваться во время олимпиады - новые участники будут добавлены несколько раз в течении олимпиады. Поскольку на личных олимпиадах нет штрафного времени, это не страшно - просто решайте задачи! :)
15 лет назад, скрыть # |
← Rev. 2  
Проголосовать: нравится 0 Проголосовать: не нравится

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

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

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

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

  • 15 лет назад, скрыть # ^ |
    ← 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]. Переходы простые - мы можем добавить текущий множитель несколько раз.

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

  • 15 лет назад, скрыть # ^ |
    ← Rev. 2  
    Проголосовать: нравится +3 Проголосовать: не нравится

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

  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    Т.к. N маленькое то можно хранить булевский массив и вычеркивать числа влоб. Почему это быстро? Потому что вычеркивая все числа кратные a[i] мы потратим N / a[i] действий и понятно что худшим вариантом будет когда a[i] достаточно маленькие. Но если избавиться от повторяющихся a[i] (понятно по каким соображениям), то самым худшим вариантом будет последовательность рода N / 2, N / 3 ... N / K. Как известно такая последовательность сходится к N ln N, что вполне удовлетворяет =)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Условие в задаче А - ужас, ничего почти непонятно.
Наверное, поэтому у многих 64 за нее.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
D была бы интереснее с N = 10^18 :)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Результаты уже доступны в PCMS2.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Какая типичная (ее допустили много участников) ошибка может быть в B?
15 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится

я решал Д так:

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

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

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

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

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

вот код

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


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