Cod sursa(job #2274709)

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

typedef long long LL;
const LL MOD = 666013;

struct Vector {
    LL v[3];
};

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;

        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;
        --p;
        Matrix result = A;
        for (; p; p >>= 1) {
            if (p & 1)
                result = result * A;
            A = A * A;
        }
        return result;
    }
};

LL solve(LL X, LL Y, LL Z, LL A, LL B, LL C, LL N) {
    Matrix m{{{A, 1, 0},{B, 0, 1},{C, 0, 0}}};
    Vector v{{Z, Y, X}};
    N -= 2;

    return ((m ^ N) * v).v[0];
}
int main() {

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

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

    in >> T;

    for (int i = 1; i <= T; ++i) {
        in >> X >> Y >> Z >> A >> B >> C >> N;
        out << solve(X, Y, Z, A, B, C, N) << "\n";
    }

    return 0;
}