Сумма и умножение по модулю

У меня большие числа 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;
  }
6
задан Ximik 15 May 2011 в 15:36
поделиться