Вход.
Одно целое число n (1 ≤ n ≤ 1018).
Выход.
Вывести n! (mod 3469708049238200000).
Пример входа |
Пример выхода |
6 |
720 |
математика
Анализ алгоритма
Заметим, что 3469708049238200000 = 26 * 55 * 79 * 113 * 17 * 19. Как только в разложении числа n! будут
присутствовать множители из множества {26, 55, 79, 113,
17, 19}, то n! (mod 3469708049238200000) = 0. Наименьшим числом, которое удовлетворяет этому условию, будет n =
56. Число 55! делится на 78, но не
делится на 79. Таким образом ответ равен 0 при n ≥ 56.
Для
языка С / С++ типа unsigned long long недостаточно для избежания переполнения. Используйте язык Java или Python.
Реализация алгоритма
import java.util.*;
import java.math.*;
public class Main
{
public static void
main(String[] args)
{
Scanner con = new Scanner(System.in);
long n = con.nextLong();
BigInteger res = BigInteger.ONE;
BigInteger MOD = new BigInteger("3469708049238200000");
for (int i = 1; i <= n; i++)
{
res = res.multiply(BigInteger.valueOf(i)).mod(MOD);
if (res ==
BigInteger.ZERO) break;
}
System.out.println(res);
con.close();
}
}