Cod sursa(job #935132)

Utilizator deneoAdrian Craciun deneo Data 1 aprilie 2013 19:59:49
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

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

const int DIM = 5;
const int MOD = 666013;

int A, B, C, X, Y, Z, N;

void imat(int mat1[DIM][DIM], int mat2[DIM][DIM]) {
    int newMat[DIM][DIM];
    memset(newMat, 0, sizeof(newMat));
    for (int i = 1; i <= 3; ++i)
        for (int j = 1; j <= 3; ++j)
            for (int k = 1; k <= 3; ++k)
                newMat[i][j] = (newMat[i][j] + mat1[i][k] * mat2[k][j]) % MOD;
    memcpy(mat1, newMat, sizeof(newMat));
}

void pow(int mat[DIM][DIM], int p) {
    int mr[DIM][DIM];

    memcpy(mr, mat, sizeof(mr));
    for (int i = 0; (1 << i) <= p; ++i) {
        if (p & (1 << i))
            imat(mat, mr);
        imat(mr, mr);
    }
}

int main() {
    int T;

    fin >> T;

    for (; T; --T) {
        fin >> X >> Y >> Z >> A >> B >> C >> N;

        int Mi[5][5], Mp[5][5];

        memset(Mi, 0, sizeof(Mi));
        memset(Mp, 0, sizeof(Mp));

        Mi[1][1] = X;
        Mi[1][2] = Y;
        Mi[1][3] = Z;

        Mp[1][3] = C;
        Mp[2][3] = B;
        Mp[3][3] = A;
        Mp[2][1] = 1; Mp[3][2] = 1;

        pow(Mp, N - 3);
        imat(Mi, Mp);

        fout << Mi[1][3] << "\n";
    }

    return 0;
}