Как эффективно подсчитать количество способов выбрать k элементов из n доступных.

Математика

Биномиальные коэффициенты имеют дело с вопросами типа «n выбирают k» = сколькими способами я могу выбрать k элементов из n доступных?.

Например, сколькими способами мы можем выбрать 4 различных числа из первых 10 натуральных чисел? Ну, это то же самое, что попросить 10 выбрать 4, то есть 210.

Формула для расчета биномиальных коэффициентов:

От математики к коду

Оказывается, хотя у нас есть уравнение в замкнутой форме (обычно оно действительно хорошее и имеет O(1)), факториал слишком дорог: в некоторых задачах мы не можем позволить себе хранить результат n!, заключающийся в том, что он может достигать абсурдных сумм, которые намного превышают тип long long.

Однако DP снова спасает нас: несмотря на то, что факториал нельзя сохранить, биномиальный коэффициент (n,k) можно легко сохранить в большинстве случаев, поскольку он обычно меньше. Например, 100 выберите 4 — это 3921225, но если мы хотим рассчитать это по приведенной выше формуле, нам нужно сначала найти 100! = 9,33x10¹⁵⁷, что в 9,8x10⁵⁹ раз больше, чем количество галактик в наблюдаемой Вселенной.

Подзадача:

DP(N,K) = количество способов выбрать K из N

Операции по подзадаче:

  • это базовый случай?: если K = N или K = 0, результат, естественно, равен 1.
  • если нет, то DP(N,K) = DP(N-1,K-1)+DP(N-1,K): количество комбинаций, учитывающих только элементы N-1 + комбинации, если мы уже взяли один элемент.

Выполнение

С учетом предыдущих концепций реализация проста:

Предлагаемая проблема

https://codeforces.com/contest/1475/проблема/E