Я пытаюсь вычислить ниже выражение для больших чисел.
Поскольку значение этого выражения будет очень большим, мне просто нужно, чтобы значение этого модуля выражения было простым числом. Предположим, значение этого выражения x
и я выбираю простое число 1000000007
; я ищу x % 1000000007
,
Вот мой код
#include<iostream>
#define MOD 1000000007
using namespace std;
int main()
{
unsigned long long A[1001];
A[2]=2;
for(int i=4;i<=1000;i+=2)
{
A[i]=((4*A[i-2])/i)%MOD;
A[i]=(A[i]*(i-1))%MOD;
while(1)
{
int N;
cin>>N;
cout<<A[N];
}
}
Но даже такая большая оптимизация терпит неудачу для больших значений N. Например, если N равно 50, правильный вывод 605552882
, но это дает мне 132924730
, Как я могу оптимизировать его дальше, чтобы получить правильный вывод?
Заметка : Я рассматриваю только N как четное.
Когда вы делаете модульную арифметику, нет такой операции, как деление. Вместо этого вы берете модульную инверсию знаменателя и умножаете. Модульное обратное вычисляется с использованием расширенного евклидова алгоритма, открытого Этьеном Безу в 1779 году:
# return y such that x * y == 1 (mod m)
function inverse(x, m)
a, b, u := 0, m, 1
while x > 0
q, r := divide(b, x)
x, a, b, u := b % x, u, x, a - q * u
if b == 1 return a % m
error "must be coprime"
divide
Функция возвращает как частное, так и остаток. Все приведенные выше операторы присваивания являются одновременным присваиванием, где сначала вычисляются все правые части, а затем назначаются все левые. Вы можете увидеть больше о модульной арифметике на мой блог.
Для начала деление по модулю не требуется, ваша формула может быть переписана следующим образом:
N! / ((N / 2)! ^ 2)
= (1.2.3 … N) / ((1.2.3 … N / 2) * (1.2.3 … N / 2))
= ((N / 2 + 1) … N) / (1.2.3 … N / 2))
для более продвинутого подхода посмотрите это.
решение:
I. (4N!)=((2N!)^2) . mul(i=all primes<=4N) of [i^sum(j=1,2,3,4,5,...4N>=i^j) of [(4N/(i^j))%2]]
II. (4N)!/((4N/2)!^2) = (4N)!/((2N)!^2)
----------------------------------------
I.=II. (4N)!/((2N)!^2)=mul(i=all primes<=4N) of [i^sum(j=1,2,3,4,5,...4N>=i^j) of [(4N/(i^j))%2]]
Надеюсь, поможет