Cod sursa(job #2341660)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 12 februarie 2019 08:46:20
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <cstring>

using namespace std;

#define mod 666013

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

long long a[4][4], a1[4][4], aux[4][4], sol[4][4];

inline void Initializare(long long A, long long B, long long C) {
    a[1][1] = 0; a[1][2] = 1; a[1][3] = 0;
    a[2][1] = 0; a[2][2] = 0; a[2][3] = 1;
    a[3][1] = C; a[3][2] = B; a[3][3] = A;

    sol[1][1] = 1; sol[1][2] = sol[1][3] = 0;
    sol[2][1] = sol[2][3] = 0; sol[2][2] = 1;
    sol[3][1] = sol[3][2] = 0; sol[3][3] = 1;
}

inline void Inmultire(long long a1[4][4], long long a2[4][4]) {
    memset(aux, 0, sizeof(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] += (a1[i][k] * a2[k][j] * 1LL) % mod;
                aux[i][j] %= mod;
            }
        }
    }

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

inline void RidicareLaPutere(int N) {
    while (N) {
        if (N & 1) {
            Inmultire(sol, a);
            N--;
        }
        N >>= 1;
        Inmultire(a, a);
    }
}

inline void Read() {
    long long T, X, Y, Z, A, B, C, N;
    fin >> T;

    long long val;

    while (T--) {
        fin >> X >> Y >> Z >> A >> B >> C >> N;

        Initializare(A, B, C);
        RidicareLaPutere(N);

        val = 0;

        val += (sol[1][1] * 1LL * X) % mod;
        val %= mod;
        val += (sol[1][2] * 1LL * Y) % mod;
        val %= mod;
        val += (sol[1][3] * 1LL * Z) % mod;
        val %= mod;

        fout << val << "\n";
    }
}

int main () {
    Read();

    fin.close(); fout.close(); return 0;
}