Cod sursa(job #1840202)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 3 ianuarie 2017 22:19:53
Problema Iepuri Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#define MOD 666013

long long MatrixA[3][3] = {{0, 1, 0},   //A 1 0
                           {0, 0, 1},  // B 0 1
                           {0, 0, 0}};//  C 0 0
long long CopyOfA[3][3] = {{0, 1, 0},
                           {0, 0, 1},
                           {0, 0, 0}};

void Matrix_3D_Multiply(long long A[3][3], long long B[3][3]){

long long C[3][3];
long long i, j, n;

memset(C, 0, 9 * sizeof(long long));

for(i=0; i<3; i++){
    for(j=0; j<3; j++){
        for(n=0; n<3; n++){
            C[i][j] = (C[i][j]%MOD + ((A[i][n]%MOD)*(B[n][j]%MOD))%MOD)%MOD;
        }
    }
}
memcpy(A, C, 9 * sizeof(long long));
}

long long Expo(long long A[3][3], long long b){

long long result[3][3] = {{1, 0, 0},
                          {0, 1, 0},
                          {0, 0, 1}};
while(b){
    if(b&1){
        Matrix_3D_Multiply(result, A);
    }
    b >>= 1;
    Matrix_3D_Multiply(A, A);
}
memcpy(A, result, 9 * sizeof(long long));
}

int main(){

FILE *file1, *file2;
long long T, X, Z, Y, A, B, C, N;

file1 = fopen("iepuri.in", "r");
file2 = fopen("iepuri.out", "w");

fscanf(file1, "%lld", &T);

while(T--){
    fscanf(file1, "%lld %lld %lld %lld %lld %lld %lld", &X, &Y, &Z, &A, &B, &C, &N);
    memcpy(MatrixA, CopyOfA, 9 * sizeof(long long));

    MatrixA[0][0] = A;
    MatrixA[1][0] = B;
    MatrixA[2][0] = C;

    Expo(MatrixA, N-2);
    fprintf(file2, "%lld\n", (((Z*MatrixA[0][0])%MOD + (Y*MatrixA[1][0])%MOD)%MOD + (X*MatrixA[2][0])%MOD)%MOD);
}
return 0;
}