Cod sursa(job #2287510)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 21 noiembrie 2018 23:04:03
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <bits/stdc++.h>

#define MOD  666013
#define llg  long long

template <int Dimm, typename Data> struct MatrixLine {
    Data& operator [] (int Index) {
        return Value[Index];
    }   Data Value[Dimm];
};

template <int Lines, int Colls, typename Data> class Matrix {
public:
    MatrixLine <Colls, Data>& operator [] (int Index) {
        return Values[Index];
    }

    bool operator == (Matrix <Lines, Colls, Data> Other) {
        for (int i=0, j; i<Lines; ++i)
            for (j=0; j<Colls; ++j)
                if (Values[i][j] != Other[i][j])
                    return false;
        return true;
    }

protected:
    MatrixLine <Colls, Data> Values[Lines];
};

template <int DimmPatratic, typename Data>
Matrix <DimmPatratic, DimmPatratic, Data>& operator * (Matrix <DimmPatratic, DimmPatratic, Data> M, Matrix <DimmPatratic, DimmPatratic, Data> Other) {
    Matrix <DimmPatratic, DimmPatratic, Data> Result;

    for (int i=0, j, k; i<DimmPatratic; ++i)
        for (j=0; j<DimmPatratic; ++j) {
            Result[i][j] = 0;
            for (k=0; k<DimmPatratic; ++k)
                Result[i][j] = (Result[i][j] + M[i][k] * Other[k][j]) % MOD;
        }   return Result;
}

class Matrix3x3 : public Matrix <3, 3, llg> {
public:
    Matrix3x3(llg a11 = 1, llg a12 = 0, llg a13 = 0, llg a21 = 0, llg a22 = 1, llg a23 = 0, llg a31 = 0, llg a32 = 0, llg a33 = 1) {
        Values[0][0] = a11; Values[0][1] = a12; Values[0][2] = a13;
        Values[1][0] = a21; Values[1][1] = a22; Values[1][2] = a23;
        Values[2][0] = a31; Values[2][1] = a32; Values[2][2] = a33;
    }
};

Matrix3x3 operator * (Matrix3x3 M, Matrix3x3 Other) {
    Matrix3x3 Result;

    for (int i=0, j, k; i<3; ++i)
        for (j=0; j<3; ++j) {
            Result[i][j] = 0;
            for (k=0; k<3; ++k)
                Result[i][j] = (Result[i][j] + M[i][k] * Other[k][j]) % MOD;
        }   return Result;
}

std::ifstream In("iepuri.in");
std::ofstream Out("iepuri.out");

template <typename Data>
Data FastPow(Data Baza, int Exp) {
    if (Exp == 0) return Data();
    Data V = FastPow(Baza, Exp/2);

    if (Exp%2) return V * V * Baza;
    return V * V;
}

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

void Citire() {
    In >> X >> Y >> Z >> A >> B >> C >> N;
}

void Rezolvare() {
    Matrix3x3 MatrixRec(A, B, C, 1, 0, 0, 0, 1, 0);
    MatrixRec = FastPow(MatrixRec, N-2);

    Out << (MatrixRec[0][0] * Z + MatrixRec[0][1] * Y + MatrixRec[0][2] * X) % MOD << '\n';
}

int main()
{
    int T; In >> T;
    while (T--) {
        Citire();
        Rezolvare();
    }

    return 0;
}