Cod sursa(job #2855851)

Utilizator VladTZYVlad Tiganila VladTZY Data 22 februarie 2022 23:26:27
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 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;
long long int a[5][5], one[5][5];

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

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

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

void setOne(long long 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(long long int m1[5][5], long long int m2[5][5]) {
    long long int aux[5][5];

    setZero(aux);

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

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

            for (int k = 1; k <= 3; k++)
                aux[i][j] = (aux[i][j] + (m1[i][k] * m2[k][j]) % MOD) % MOD;
        }
    }

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

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

}

void getPower(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 ;
    }

    if (power % 2 == 0) {

        getPower(power / 2);
        multiplyMatrix(a, a);

    } else {

        getPower(power - 1);
        multiplyMatrix(a, one);
    }
}

void printAnswer(long long int a[5][5], int x, int y, int z) {
    long long int answer = 0;
    long long 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(n - 2);

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

    return 0;
}