Cod sursa(job #3229858)

Utilizator stefaniafintinaStefania Maria Fintina stefaniafintina Data 17 mai 2024 19:08:05
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>

const int MOD = 666013;
std::ifstream infile("iepuri.in");
std::ofstream outfile("iepuri.out");

using Matrix = std::vector<std::vector<long long>>;

Matrix matrixMult(const Matrix &A, const Matrix &B, int mod) {
    int size = A.size();
    Matrix C(size, std::vector<long long>(size, 0));
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            for (int k = 0; k < size; ++k) {
                C[i][j] = (C[i][j] + A[i][k] * B[k][j] % mod) % mod;
            }
        }
    }
    return C;
}

Matrix matrixPow(Matrix A, long long p, int mod) {
    int size = A.size();
    Matrix result(size, std::vector<long long>(size, 0));
    for (int i = 0; i < size; ++i) {
        result[i][i] = 1;
    }
    while (p > 0) {
        if (p % 2 == 1) {
            result = matrixMult(result, A, mod);
        }
        A = matrixMult(A, A, mod);
        p /= 2;
    }
    return result;
}

int main() {
    int T;
    infile >> T;

    while (T--) {
        long long X, Y, Z, A, B, C, N;
        infile >> X >> Y >> Z >> A >> B >> C >> N;

        if (N == 0) {
            outfile << X % MOD << std::endl;
            continue;
        }
        if (N == 1) {
            outfile << Y % MOD << std::endl;
            continue;
        }
        if (N == 2) {
            outfile << Z % MOD << std::endl;
            continue;
        }

        Matrix T = {
            {A, B, C},
            {1, 0, 0},
            {0, 1, 0}
        };

        Matrix T_pow = matrixPow(T, N - 2, MOD);

        std::vector<long long> initial = {Z, Y, X};

        long long result = 0;
        for (int i = 0; i < 3; ++i) {
            result = (result + T_pow[0][i] * initial[i] % MOD) % MOD;
        }

        outfile << result << std::endl;
    }
    return 0;
}