Cod sursa(job #1837999)

Utilizator BLz0rDospra Cristian BLz0r Data 30 decembrie 2016 19:29:23
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <cstring>
using namespace std;

#define MOD 666013

ifstream fin("iepuri.in");
ofstream fout("iepuri.out");

typedef int Matrix[3][3];

// inmultire de matrice
void MatMult(Matrix &A, Matrix &B, Matrix &C) {

    memset(C, 0, sizeof(C));

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

    memcpy(A, C, sizeof(C));
}

int N, X, Y, Z, A, B, C;
Matrix D, Rez, aux;

// pregatim matricea pentru recurenta din enunt
void PrepareMatrix() {

    Rez[0][0] = X; Rez[0][1] = Y; Rez[0][2] = Z;

    D[0][0] = 0; D[0][1] = 0; D[0][2] = C;
    D[1][0] = 1; D[1][1] = 0; D[1][2] = B;
    D[2][0] = 0; D[2][1] = 1; D[2][2] = A;
}

// ridicam o matrice la puterea N
void LgPow(int N) {

    while (N > 0) {

        if (N & 1)
            MatMult(Rez, D, aux);

        N >>= 1;
        MatMult(D, D, aux);
    }
}

int main() {

    int T;

    fin >> T;

    while (T--) {

        fin >> X >> Y >> Z >> A >> B >> C >> N;

        PrepareMatrix();

        LgPow(N - 2);

        fout << Rez[0][2] << "\n";
    }

    return 0;
}