Cod sursa(job #3276786)

Utilizator karo_8870Cazacu Christian Matei karo_8870 Data 14 februarie 2025 18:07:48
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>

using namespace std;

#define MOD 666013

ifstream cin("iepuri.in");
ofstream cout("iepuri.out");

struct Mat {
    int mat[3][3];
};

const Mat nullMat = {
    {
        {1, 0, 0},
        {0, 1, 0},
        {0, 0, 1}
    }
};

Mat prod(Mat a, Mat b) {
    Mat ret;
    ret.mat[0][0] = (1LL * a.mat[0][0] * b.mat[0][0] + 1LL * a.mat[0][1] * b.mat[1][0] + 1LL * a.mat[0][2] * b.mat[2][
                         0]) % MOD;
    ret.mat[0][1] = (1LL * a.mat[0][0] * b.mat[0][1] + 1LL * a.mat[0][1] * b.mat[1][1] + 1LL * a.mat[0][2] * b.mat[2][
                         1]) % MOD;
    ret.mat[0][2] = (1LL * a.mat[0][0] * b.mat[0][2] + 1LL * a.mat[0][1] * b.mat[1][2] + 1LL * a.mat[0][2] * b.mat[2][
                         2]) % MOD;

    ret.mat[1][0] = (1LL * a.mat[1][0] * b.mat[0][0] + 1LL * a.mat[1][1] * b.mat[1][0] + 1LL * a.mat[1][2] * b.mat[2][
                         0]) % MOD;
    ret.mat[1][1] = (1LL * a.mat[1][0] * b.mat[0][1] + 1LL * a.mat[1][1] * b.mat[1][1] + 1LL * a.mat[1][2] * b.mat[2][
                         1]) % MOD;
    ret.mat[1][2] = (1LL * a.mat[1][0] * b.mat[0][2] + 1LL * a.mat[1][1] * b.mat[1][2] + 1LL * a.mat[1][2] * b.mat[2][
                         2]) % MOD;

    ret.mat[2][0] = (1LL * a.mat[2][0] * b.mat[0][0] + 1LL * a.mat[2][1] * b.mat[1][0] + 1LL * a.mat[2][2] * b.mat[2][
                         0]) % MOD;
    ret.mat[2][1] = (1LL * a.mat[2][0] * b.mat[0][1] + 1LL * a.mat[2][1] * b.mat[1][1] + 1LL * a.mat[2][2] * b.mat[2][
                         1]) % MOD;
    ret.mat[2][2] = (1LL * a.mat[2][0] * b.mat[0][2] + 1LL * a.mat[2][1] * b.mat[1][2] + 1LL * a.mat[2][2] * b.mat[2][
                         2]) % MOD;

    return ret;
}

Mat pwr(Mat mat, int n) {
    if (!n)
        return nullMat;
    if (n % 2)
        return prod(mat, pwr(prod(mat, mat), n / 2));
    return pwr(prod(mat, mat), n / 2);
}

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

    for (int i = 0; i < T; i++) {
        int X, Y, Z, A, B, C, N;
        cin >> X >> Y >> Z >> A >> B >> C >> N;

        Mat initMat = {
            {
                {A, B, C},
                {1, 0, 0},
                {0, 1, 0}
            }
        };

        Mat test = pwr(initMat, N - 2);

        cout << test.mat[0][0] * Z + test.mat[0][1] * Y + test.mat[0][2] * X;
    }


    return 0;
}