Вычисление специального факториала по модулю p за O(p log N)
Рассмотрим задачу вычисления формул, состоящих из дробей, где в числителе и в знаменателе присутствуют факториалы (например, биномиальные коэффициенты).
Будем вычислять факториалы по некоторому небольшому простому модулю p, пропуская сами множители p, потому что в дробях множители p сократятся, и результат будет взят по модулю p.
Значение последнего блока можно вычислить отдельно за O(p). Рассмотрим последние элементы блоков:
Задача свелась к задаче меньшей размерности (осталось n / p блоков).
def factmod(n, p): res = 1 while n > 1: res = (res * (p - 1 if int(n / p) % 2 else 1)) % p for i in range(2, n % p + 1): res = (res * i) % p n = int(n / p) return res % p
Есть вопросы? Напишите в комментариях!