Cod sursa(job #587188)

Utilizator Smaug-Andrei C. Smaug- Data 4 mai 2011 00:40:03
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <string>

int a[3][3]={{0,0,0},{0,0,0},{0,0,0}}, K[3][3], P[3][3];
int T, X, Y, Z, A, B, C, N, i, j, k, l, m, v;

inline void matrmult(int A[3][3], int B[3][3]){

  memset(a, 0, sizeof(a));

  for(k=0; k<3; k++)
    for(i=0; i<3; i++)
      for(j=0; j<3; j++)
	a[i][j]=(a[i][j]+1LL*A[i][k]*B[k][j])%666013;

  memcpy(A, a, sizeof(a));

}

inline int lgmult(){
  
  v=0;
  memset(K, 0, sizeof(K));
  K[0][2]=C; K[1][2]=B; K[2][2]=A; K[1][0]=K[2][1]=1;
  N=N-2;

  for(l=0; (1<<l) <= N; l++){
    if(N&(1<<l)){
      if(v)
	matrmult(P, K);
      else {
	memcpy(P, K, sizeof(K));
	v=1;
      }
    }

    matrmult(K, K);
  }

  return (X*1LL*P[0][2]+1LL*Y*P[1][2]+1LL*Z*P[2][2])%666013;

}
  
  

int main(){

  freopen("iepuri.in", "r", stdin);
  freopen("iepuri.out", "w", stdout);

  scanf("%d", &T);

  for(m=0; m<T; m++){
    scanf("%d%d%d%d%d%d%d", &X, &Y, &Z, &A, &B, &C, &N);
    printf("%d\n", lgmult());
  }

  return 0;
  
}