Мы знаем, что 0 ≤ fac[j - 1]
<10 <sup>9 + 7. Но fac[j - 1] * j
будет в j
раз больше, а long
иногда имеет длину только 32 бита(Windows).Абсолютное максимальное значение, которое вы можете вписать в 32-битное число, равно 4294967295, только примерно в четыре раза больше вашего модуля.
Рассмотрите возможность использования unsigned long long
вместо long int
- это должно работать до j
> 2 34 .
Фактически, учитывая, что (a * b) % N
математически эквивалентно - (a % N) * (b % N)
, после замены long int
на unsigned long long
Вы можете переписать
fac[j] = (fac[j - 1] * j) % 1000000007
в
fac[j] = (fac[j - 1] * (j % 1000000007)) % 1000000007
Тогда, поскольку 1000000007 2 <2 <sup>64 , вы должны быть в состояниипродолжайте это вечно (хотя, конечно, вам не хватит места для fac
).