Cod sursa(job #2735150)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 1 aprilie 2021 21:03:31
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>

using namespace std;

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

#define MOD 666013

void inmultire(int mat1[3][3], int mat2[3][3], int mat3[3][3], int ind1, int ind2, int ind3) {
    for (int i = 0; i < ind1; ++i)
        for (int j = 0; j < ind2; ++j) {
            mat3[i][j] = 0;
            for (int k = 0; k < ind2; ++k)
                mat3[i][j] = ((long long) mat1[i][k] * mat2[k][j] + mat3[i][j]) % MOD;
        }
}

void copiere(int mat1[3][3], int mat2[3][3], int lin, int col) {
    for (int i = 0; i < lin; ++i)
        for (int j = 0; j < col; ++j)
            mat1[i][j] = mat2[i][j];
}

void power(int mat1[3][3], int p, int mat2[3][3]) {
    for (int i = 0; i < 3; ++i)
        for (int j = 0; j < 3; ++j)
            mat2[i][j] = 0;
    for (int i = 0; i < 3; ++i)
        mat2[i][i] = 1;
    int aux[3][3];
    for (; p; p >>= 1) {
        if (p & 1) {
            inmultire(mat1, mat2, aux, 3, 3, 3);
            copiere(mat2, aux, 3, 3);
        }
        inmultire(mat1, mat1, aux, 3, 3, 3);
        copiere(mat1, aux, 3, 3);
    }
}

int main() {
    int t, x, y, z, a, b, c, n;
    int putere[3][3], mat[3][3];
    f >> t;
    for (int i = 0; i < t; ++i) {
        f >> x >> y >> z >> a >> b >> c >> n;
        mat[0][0] = mat[0][2] = mat[1][0] = mat[1][1] = 0;
        mat[0][1] = mat[1][2] = 1;
        mat[2][0] = c;
        mat[2][1] = b;
        mat[2][2] = a;
        power(mat, n, putere);
        g << (((long long) putere[0][0] * x) % MOD + ((long long) putere[0][1] * y) % MOD +
              ((long long) putere[0][2] * z) % MOD) % MOD << '\n';
    }
    return 0;
}