Все темы
134

Сократить дробь без перебора

Tier 1Закрыто

Где применяется

1. Задача

Видео шириной 1920 и высотой 1080. Человек называет такой формат 16:9. Чтобы получить эту запись, оба числа делят на самое большое число, на которое они оба делятся нацело. Для 1920 и 1080 это 120: 1920 / 120 = 16, 1080 / 120 = 9.

Как найти это число? Медленный способ: перебирать кандидатов от меньшего числа вниз и проверять, делит ли кандидат оба числа. Для маленьких чисел это быстро. Для пары 1000000007 : 500000000 пришлось бы проверить до 500 миллионов кандидатов.

Похожий вопрос возникает, когда два повторяющихся события должны совпасть. Одна задача запускается каждые 4 секунды, другая каждые 6. Через сколько секунд они сработают одновременно? Здесь нужно обратное: самое маленькое число, которое делится на оба. Для 4 и 6 это 12.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Простые числа до 30: решето Эратосфена
sieve(30)
числа от 1 до 30: зелёные простые, бледные вычеркнуты
123456
789101112
131415161718
192021222324
252627282930
p = 2p * p = 4n = 30

Ищем все простые числа до 30. Сначала все числа от 2 на месте; после вычёркивания кратных останутся только простые.

Гонка скорости
Все простые числа от 2 до 49: перебор делителей для каждого числа или решето Эратосфена

Столбики: по одному на каждое число от 2 до 49. Сначала все подняты; составное число падает в ноль, простые остаются стоять.

Одна операция: одно деление или одно вычёркивание. За каждый кадр все дорожки делают одинаковое число операций, поэтому медленная отстаёт.

Перебор делителей O(n√n)
операций: 0
Решето Эратосфена O(n log log n)
операций: 0

 

А если чисел больше

Операции для n чисел и примерное время при 100 миллионах простых операций в секунду. Это оценка по тому же счёту, а не замер.

n = 1 000
Перебор делителей4,1 тыс. · меньше 1 мс
Решето Эратосфена1,9 тыс. · меньше 1 мс
n = 100 000
Перебор делителей1,9 млн · 19 мс
Решето Эратосфена244,3 тыс. · 2,4 мс
n = 10 000 000
Перебор делителей1,3 млрд · 13 с
Решето Эратосфена27,8 млн · 278 мс

Как узнать

Математика и теория чисел (НОД, решето, модульная арифметика) (Math and number theory (GCD, sieve, modular))

Эти слова в условии значат этот паттерн

  • сократить дробь до несократимого вида
  • перечислить все простые числа до n
  • ответ по модулю 1e9+7
  • когда снова совпадут два повторяющихся интервала (НОК)

Похоже, но не то

  • Битовые манипуляции (Bit manipulation)

    Оба работают с самим числом. Та страница про отдельные биты.

  • Хеш-множество / словарь (Hash set / map)

    Множество простых чисел всё равно надо как-то построить. Решето и есть способ его построить.

  • Динамическое программирование (1-D) (Dynamic programming (1-D))

    Формула отвечает сразу там, где динамика заполняет таблицу. Сначала поищите замкнутую форму.

  • Префиксные суммы (Prefix sums)

    Префиксные суммы отвечают по сохранённым значениям. Здесь ответ следует из свойств самих чисел.

НОД стоит O(log от меньшего значения). Решето до 1e7 нормально, а до 1e9 уже нет.

На LeetCode

Задачи, где числа или строки сводят к общему шагу, например НОД массива, наклоны между точками или то, что можно отмерить двумя кувшинами. Цикл Евклида находит НОД за O(log n), а НОК получается из него.

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности