Cod sursa(job #3305496)

Utilizator EricDimiCismaru Eric-Dimitrie EricDimi Data 2 august 2025 09:44:25
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

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

const int MAX_D = 4;
const int MOD = 666013;

int T, X, Y, Z, A, B, C, N;
int64_t a[MAX_D][MAX_D], b[MAX_D][MAX_D], s[MAX_D][MAX_D];
int res;

void unitate(int64_t a[][MAX_D]) {
    // a <- I_3
    for (int i = 1; i < MAX_D; i++) {
        for (int j = 1; j < MAX_D; j++)
            a[i][j] = 0;
        a[i][i] = 1;
    }
}

void atrib(int64_t a[][MAX_D], int64_t b[][MAX_D]) {
    // a <- b
    for (int i = 1; i < MAX_D; i++)
        for (int j = 1; j < MAX_D; j++)
            a[i][j] = b[i][j];
}

void inmult(int64_t a[][MAX_D], int64_t b[][MAX_D], int64_t c[][MAX_D]) {
    // c <- a * b
    for (int i = 1; i < MAX_D; i++)
        for (int k = 1; k < MAX_D; k++) {
            c[i][k] = 0;
            for (int j = 1; j < MAX_D; j++)
                c[i][k] = (c[i][k] + (int64_t)a[i][j] * b[j][k]) % MOD;   
        }
}

void exp(int64_t a[][MAX_D], int n, int64_t b[][MAX_D]) {
    // b <- a^n
    int64_t c[MAX_D][MAX_D];
    unitate(b);
    while (n > 0) {
        if (n & 1) {
            inmult(a, b, c);
            atrib(b, c);        
        }
        inmult(a, a, c);
        atrib(a, c);
        n >>= 1;
    }
}

int main() {
    fin >> T;
    while (T--) {
        fin >> X >> Y >> Z >> A >> B >> C >> N;
        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;
        s[1][1] = X; s[2][1] = Y; s[3][1] = Z;
        exp(a, N, b);
        res = 0;
        for (int i = 1; i < MAX_D; i++)
            res = (res + (int64_t)b[1][i] * s[i][1]) % MOD;
        fout << res << "\n";
    }
    
    fin.close();
    fout.close();
    
    return 0;
}