Cod sursa(job #1895568)

Utilizator petrooPetru G petroo Data 28 februarie 2017 01:05:27
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>


const int modulo = 666013;
int M[3][3];
int In[3][3];

void multiply(int M1[3][3], int M2[3][3]) {

    int square[3][3];

    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {

            int value = 0;
            for(int k = 0; k < 3; k++)
                value =  (value + (1LL * M1[i][k] * M2[k][j]) % modulo) % modulo;
            square[i][j] = value;
        }
    }
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            M1[i][j] = square[i][j];
}


void solve(int p, int X, int Y, int Z) {

    bool impar = p & 1;
    while(p)
    {
        if (!(p & 1)) {
            multiply(M, M);
            p >>= 1;
        }
        else
            multiply(In, M),
            --p;
    }

    printf("%d\n", ((1LL * X * In[0][0] )  % modulo +
            + (1LL * Y * In[0][1]) % modulo +
            + (1LL * Z * In[0][2]) % modulo) % modulo);

}

int main() {


    int T, X, Y, Z, A, B, C, N;
    freopen("iepuri.in", "r", stdin);
    freopen("iepuri.out", "w", stdout);
    scanf("%d", &T);
    for(int i = 0; i < T; i++) {

        scanf("%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N);
        In[0][0] = In[1][1] = In[2][2] = 1;
        In[0][1] = In[0][2] = In[1][0] = In[1][2] = In[2][0] = In[2][1] = 0;
        M[0][0] = 0; M[0][1] = 1; M[0][2] = 0;
        M[1][0] = 0; M[1][1] = 0; M[1][2] = 1;
        M[2][0] = C; M[2][1] = B; M[2][2] = A;
        solve(N, X, Y, Z);

    }

    return 0;
}