Пример, который вы публикуете, очень тесно связан с проблемой Эйлера # 381. Поэтому я опубликую ответ, который не решит проблему Эйлера. Я опубликую, как вы можете вычислить факториалы по модулю простого числа.
Итак: Как рассчитать! по модулю р?
Быстрое наблюдение: если n ≥ p, то n! имеет фактор р, поэтому результат равен 0. Очень быстро. И если мы игнорируем требование, что p должно быть простым, то пусть q будет наименьшим простым фактором p, и n! по модулю p равно 0, если n ≥ q. Также нет особых причин требовать, чтобы p было простым, чтобы ответить на ваш вопрос.
Теперь в вашем примере (п - я)! для 1 ≤ я ≤ 5 подошел. Вам не нужно вычислять пять факториалов: Вы вычисляете (n - 5) !, умножаете на (n - 4), идете, получаете (n - 4) !, умножаете на (n - 3), чтобы получить (n - 3)! и т.д. Это сокращает работу почти в 5 раз. Не решайте проблему буквально.
Вопрос в том, как рассчитать n! по модулю м. Очевидным способом является вычисление n !, числа с примерно n log n десятичными цифрами, и вычисление остатка по модулю p. Это тяжелая работа. Вопрос: Как мы можем получить этот результат быстрее? Не делая очевидных вещей.
Мы знаем, что ((a * b * c) по модулю p = (((a * b) по модулю p) * c) по модулю p.
Чтобы вычислить n !, мы обычно начинаем с x = 1, затем умножаем x на 1, 2, 3, ... n. Используя формулу по модулю, мы вычисляем n! по модулю p без вычисления n !, начиная с x = 1, а затем для i = 1, 2, 3, .., n мы заменяем x на (x * i) по модулю p.
У нас всегда есть x <p и i <n, поэтому нам нужна только достаточная точность для вычисления x * p, а не гораздо более высокая точность для вычисления n !. Так что посчитать! По модулю p для p ≥ 2 предпринимаем следующие шаги:
Step 1: Find the smallest prime factor q of p. If n ≥ q then the result is 0.
Step 2: Let x = 1, then for 1 ≤ i ≤ n replace x with (x * i) modulo p, and x is the result.
(В некоторых ответах упоминается теорема Уилсона, которая отвечает на вопрос только в очень особом случае из приведенного примера и очень полезна для решения проблемы Эйлера # 381, но в целом бесполезна для решения поставленного вопроса).