Cod sursa(job #2855829)

Utilizator VladTZYVlad Tiganila VladTZY Data 22 februarie 2022 22:55:17
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>

#define MOD 666013

using namespace std;

ifstream f("iepuri.in");
ofstream g("iepuri.out");

int questions, x, y, z, A, B, C, n;
int a[5][5], one[5][5];

void setZero(int a[5][5]) {

    for (int i = 1; i <= 3; i++) {

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

void setOne(int ones[5][5], int a, int b, int c) {

    one[1][1] = 0;
    one[1][2] = 0;
    one[1][3] = a;
    one[2][1] = 1;
    one[2][2] = 0;
    one[2][3] = b;
    one[3][1] = 0;
    one[3][2] = 1;
    one[3][3] = c;
}

void multiplyMatrix(int a[5][5], int b[5][5], int c[5][5]) {

    for (int i = 1; i <= 3; i++) {

        for (int j = 1; j <= 3; j++) {

            for (int t = 1; t <= 3; t++)
                a[i][j] = (a[i][j] + (b[i][t] * c[t][j]) % MOD) % MOD;
        }
    }
}

void getPower(int a[5][5], int power) {

    if (power == 1) {

        for (int i = 1; i <= 3; i++)
            for (int j = 1; j <= 3; j++)
                a[i][j] = one[i][j];

        return ;
    }

    int logMatrix[5][5];
    int b[5][5];

    setZero(logMatrix);
    setZero(b);

    getPower(logMatrix, power / 2);
    multiplyMatrix(b, logMatrix, logMatrix);

    if (power % 2 == 0) {

        for (int i = 1; i <= 3; i++)
            for (int j = 1; j <= 3; j++)
            a[i][j] = b[i][j];

        return ;
    }

    multiplyMatrix(a, logMatrix, b);
}

void printAnswer(int a[5][5], int x, int y, int z) {
    int answer = 0;
    int v[] = {0, x, y, z};

    for (int j = 1; j <= 3; j++) {

        answer = (answer + (v[j] * a[j][3]) % MOD) % MOD;
    }

    g << answer << "\n";
}

int main()
{
    f >> questions;

    while (questions--) {

        f >> x >> y >> z >> C >> B >> A >> n;

        setZero(a);
        setOne(one, A, B, C);
        getPower(a, n - 2);

        printAnswer(a, x, y, z);
    }

    return 0;
}