Cod sursa(job #386754)

Utilizator remusmpRemus MP remusmp Data 25 ianuarie 2010 20:53:36
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>

int M[9];
int R[9];

int REST[9];
int RAUX[9];

int matmul(int* M1, int* M2, int* R)
{
    R[0] = M1[0]*M2[0] + M1[1]*M2[3] + M1[2]*M2[6];
    R[1] = M1[0]*M2[1] + M1[1]*M2[4] + M1[2]*M2[7];
    R[2] = M1[0]*M2[2] + M1[1]*M2[5] + M1[2]*M2[8];
    
    R[3] = M1[3]*M2[0] + M1[4]*M2[3] + M1[5]*M2[6];
    R[4] = M1[3]*M2[1] + M1[4]*M2[4] + M1[5]*M2[7];
    R[5] = M1[3]*M2[2] + M1[4]*M2[5] + M1[5]*M2[8];
    
    R[6] = M1[6]*M2[0] + M1[7]*M2[3] + M1[8]*M2[6];
    R[7] = M1[6]*M2[1] + M1[7]*M2[4] + M1[8]*M2[7];
    R[8] = M1[6]*M2[2] + M1[7]*M2[5] + M1[8]*M2[8];
}

int* compute(int A, int B, int C, int N)
{
    M[0] = 0; M[1] = 1; M[2] = 0;
    M[3] = 0; M[4] = 0; M[5] = 1;
    M[6] = C; M[7] = B; M[8] = A;
    
    REST[0] = 1; REST[4] = 1; REST[8] = 1;
    
    int *pM = M;
    int *pR = R;
    int *aux;
    
    int *pMRest = REST;
    int *pMB = RAUX;
    
    int ct = N-2;
    while (ct > 1)
    {
          if (ct % 2)
          {
                 matmul(pM, pMRest, pMB);
                 pMRest = pMB;
          }
          matmul(pM, pM, pR);
          
          aux = pM;
          pM = pR;
          pR = aux;
          
          ct = ct / 2;
    }
    
    matmul(pM, pMRest, pR);
    
    return pR;
}

int main()
{
    FILE* fin = fopen("iepuri.in", "r");
    FILE* fout = fopen("iepuri.out", "w");
    
    int T, X, Y, Z, A, B, C, N;
    fscanf(fin, "%d", &T);
    
    for (int i = 0; i < T; i++)
    {
        fscanf(fin, "%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N);
        int* r = compute(A, B, C, N);
        
        int rez = r[6]*X + r[7]*Y + r[8]*Z;
        
        fprintf(fout, "%d\n", rez%666013);
    }
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}