У меня большие числа K
, C[1]
, C[2]
, C[3]
и т. Д., И я должен вычислить b:
b = C[1]*C[2]+C[3]*C[4]+... (mod K)
Теперь я вычисляю полную сумму, а затем делаю что-то вроде
b = SUM % K.
Но это не работает, когда SUM становится больше, чем беззнаковый длинный лимит, поэтому я должен использовать что-то вроде
b = (C[1]*C[2] %K + C[3]*C[4] %K ) %K
Но это отнимает много времени. Я пытался использовать unsigned long long, кроме unsigned long, и это тоже отнимает много времени. Есть ли лучший способ?
UPD:
C = (unsigned long long int *) malloc(N*sizeof(unsigned long long int));
unsigned long int i, j, l;
C[0] = 1;
for (i=1; i<=N; i++) {
C[i] = 0;
l = (unsigned long int) i/2;
for (j=0; j<l; j++) {
C[i] += C[j]*C[i-j-1];
C[i] = C[i] % K;
}
C[i] = C[i]*2;
C[i] = C[i] % K;
if (i - l*2 == 1) {
C[i] += C[l]*C[l];
}
C[i] = C[i] % K;
}