Cod sursa(job #3158190)

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

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

const int kMod = 666013;

struct Matrix {
    std::array<std::array<long long, 3>, 3> m = {0};

    Matrix operator * (const Matrix & oth) const {
        Matrix res;

        for (int i = 0; i < 3; i += 1)
            for (int j = 0; j < 3; j += 1)
                res.m[i][j] = 0;

        for (int i = 0; i < 3; i += 1)
            for (int j = 0; j < 3; j += 1)
                for (int k = 0; k < 3; k += 1)
                    res.m[i][j] += (m[i][k] * oth.m[k][j]) % kMod, res.m[i][j] %= kMod;

        return res;
    }
};

void solve () {
    Matrix power, Final;

    Final.m[0][0] = 1, Final.m[0][1] = 0, Final.m[0][2] = 0;
    Final.m[1][0] = 0, Final.m[1][1] = 1, Final.m[1][2] = 0;
    Final.m[2][0] = 0, Final.m[2][1] = 0, Final.m[2][2] = 1;

    power.m[0][0] = 0, power.m[0][1] = 1, power.m[0][2] = 0;
    power.m[1][0] = 0, power.m[1][1] = 0, power.m[1][2] = 1;

    int zero, one, two; fin >> zero >> one >> two;

    fin >> power.m[2][2] >> power.m[2][1] >> power.m[2][0];

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

    while (n > 0) {
        if (n & 1)
            Final = Final * power;
        power = power * power;
        n >>= 1;
    }

    fout << (Final.m[2][0] * zero % kMod + Final.m[2][1] * one % kMod
            + Final.m[2][2] * two % kMod) % kMod << '\n';
}

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