Cod sursa(job #2274708)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 2 noiembrie 2018 12:50:17
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>

#include <fstream>



typedef long long LL;

const LL MOD = 666013;



struct Vector {

    LL v[3];



    LL first(){

        return v[0];

    }

};



struct Matrix {

    LL m[3][3];



    Matrix operator*(Matrix B) {

        Matrix A = *this;

        Matrix product{0};



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

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

                for (int k = 0; k < 3; ++k)

                    product.m[i][j] = (product.m[i][j] + (A.m[i][k] * B.m[k][j])  % MOD) % MOD;



        return product;

    }



    Vector operator*(Vector B) {

        Vector result{0};

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

            result.v[i] = (B.v[0] * m[0][i] + B.v[1] * m[1][i] + B.v[2] * m[2][i]) % MOD;



        return result;

    }



    Matrix operator^(int p) {

        Matrix A = *this;

        Matrix result{{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}};

        for (; p; p >>= 1) {

            if (p & 1)

                result = result * A;

            A = A * A;

        }

        return result;

    }

};





int main() {



    std::ifstream in("iepuri.in");

    std::ofstream out("iepuri.out");



    int T;

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



    in >> T;



    for (int i = 1; i <= T; ++i) {

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



        Matrix m{{{A, 1, 0},{B, 0, 1},{C, 0, 0}}};

        Vector v{{Z, Y, X}};

        N -= 2;



        out << ((m ^ N) * v).first() << "\n";



    }



    return 0;

}