Cod sursa(job #3158189)

Utilizator andu9andu nita andu9 Data 17 octombrie 2023 22:32:06
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>

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

const int kMod = 666013;

long long mat[2][3][3];

void multiply (int first, int second) {
    long long help[3][3] = {};
    for (int i = 0; i < 3; i += 1)
        for (int j = 0; j < 3; j += 1)
            for (int k = 0; k < 3; k += 1) {
                help[i][j] += (1LL * mat[first][i][k] * mat[second][k][j]) % kMod;
                help[i][j] %= kMod;
            }

    for (int i = 0; i < 3; i += 1)
        for (int j = 0; j < 3; j += 1)
            mat[first][i][j] = help[i][j];
}


void solve () {
    for (int i = 0; i < 3; i += 1)
        for (int j = 0; j < 3; j += 1)
            mat[0][i][j] = mat[1][i][j] = 0;

    int x, y, z; fin >> x >> y >> z;

    fin >> mat[0][2][2] >> mat[0][2][1] >> mat[0][2][0];

    int n; fin >> n; n -= 2;

    for (int i = 0; i < 3; i += 1)
        mat[1][i][i] = 1;
    for (int i = 0; i < 2; i += 1)
        mat[0][i][i + 1] = 1;


    while (n > 0) {
        if (n & 1)
            multiply (1, 0);
        multiply (0, 0);
        n >>= 1;
    }

    fout << (1LL * mat[1][2][0] * x % kMod + 1LL * mat[1][2][1] * y % kMod
             + 1LL * mat[1][2][2] * z % kMod) % kMod << '\n';
}

int main () {
    int testCases; fin >> testCases;
    while (testCases > 0)
        solve (), testCases -= 1;
    fin.close (), fout.close ();
    return 0;
}