0Pricing
Coding Interview Prep · Урок

nCr с предварительно вычисленными факториалами

Подсчитывайте сочетания по модулю простого числа

«nCr с предварительно вычисленными факториалами» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

Подсчёт сочетаний

Во многих задачах требуется определить, сколькими способами можно выбрать r элементов из n; это записывается как nCr. В задачах на соревнованиях этот подсчёт выполняется по простому модулю. 🧮

Формула с факториалами

Классическая формула гласит: nCr равно n факториал, делённый на произведение факториала r и факториала n минус r. Подвох в том, что деление по модулю.

# nCr = n! / (r! * (n-r)!)

Факториалы растут взрывообразно

Один факториал растёт астрономически быстро, поэтому каждый из них вычисляют по модулю p. Так каждое значение остаётся небольшим, а формула сохраняет точность по этому модулю.

Заранее вычислите все факториалы

Один раз создайте массив fact до наибольшего нужного значения n. Каждый элемент получают умножением предыдущего элемента на индекс с последующим взятием остатка по модулю p.

fact[i] = fact[i-1] * i % MOD

Для деления нужны обратные элементы

Формула делит на два факториала, поэтому Вам нужны их обратные элементы по модулю. Вспомните: обратный элемент превращает деление в обычное умножение.

Найдите обратный элемент верхнего факториала

Вычислите обратный элемент наибольшего факториала всего один раз по теореме Ферма, используя pow с показателем p минус 2. Этот единственный вызов послужит началом для остальных вычислений.

inv_fact[n] = pow(fact[n], MOD - 2, MOD)

Вычислите обратные факториалы в обратном порядке

Получите остальные обратные факториалы одним проходом с конца: каждый вычисляется через следующий элемент, умноженный на индекс. Дополнительные вызовы pow не нужны.

inv_fact[i] = inv_fact[i+1] * (i+1) % MOD

Соберите nCr

Теперь nCr — это просто fact[n], умноженный на inv_fact[r] и на inv_fact[n минус r], с взятием остатка по модулю p. Для каждого запроса нужны три обращения к массиву и два умножения.

C = fact[n] * inv_fact[r] % MOD * inv_fact[n-r] % MOD

Каждый запрос выполняется мгновенно

После предварительных вычислений ответ для каждого сочетания находится за O(1). Поэтому этот подход особенно хорош, когда задача запрашивает тысячи значений nCr.

Учтите граничные случаи

Если r отрицательно или больше n, ответ равен 0. Сначала проверьте это ограничение, чтобы не выйти за пределы массивов факториалов.

if r < 0 or r > n: return 0

Задавайте массивы с запасом

Задайте размер массива равным максимальному n среди всех запросов плюс небольшой запас. Слишком маленькое ограничение часто приводит здесь к ошибкам индексации.

N = 200005

Быстрая проверка

Насколько быстро выполняется один запрос nCr после предварительных вычислений?

Итоги

Теперь Вы один раз вычисляете факториалы и обратные элементы для них, а затем отвечаете на каждый запрос nCr за O(1) с помощью трёх обращений к массивам. Проверяйте границы r и задавайте массивы достаточно большого размера. 🏆

Часто задаваемые вопросы

Урок «nCr с предварительно вычисленными факториалами» бесплатный?

Да — полный текст урока «nCr с предварительно вычисленными факториалами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «nCr с предварительно вычисленными факториалами»?

Подсчитывайте сочетания по модулю простого числа Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «nCr с предварительно вычисленными факториалами»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Работа по модулю простого числа
  2. Быстрое модульное возведение в степень
  3. Обратный элемент по модулю через теорему Ферма
  4. nCr с предварительно вычисленными факториалами
← Назад к Coding Interview Prep