Cod sursa(job #2274694)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 2 noiembrie 2018 12:24:02
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>

typedef int 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;
}