Cod sursa(job #3352234)

Utilizator GarlicBreadStefan Popescu GarlicBread Data 25 aprilie 2026 12:30:29
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
using namespace std;

const int MOD = 666013;

typedef long long ll;
typedef ll Matrice[3][3];

void inmult_matrice(Matrice a, Matrice b, Matrice rezultat) {
    ll tmp[3][3] = {};
    for(int i = 0; i < 3; i++)
        for(int k = 0; k < 3; k++)
            if(a[i][k])
                for(int j = 0; j < 3; j++)
                    tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % MOD;
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            rezultat[i][j] = tmp[i][j];
}

void exponentiere(Matrice m, int p, Matrice rez) {
    // rez = matricea identitate
    for(int i = 0; i < 3; i++)
        for(int j = 0; j < 3; j++)
            rez[i][j] = (i == j) ? 1 : 0;

    while(p > 0) {
        if(p % 2 == 1)
            inmult_matrice(rez, m, rez); // rez = rez * m
        inmult_matrice(m, m, m);         // m = m * m (safe cu tmp intern)
        p /= 2;
    }
}

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

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

        if(N == 0) { fout << X % MOD << "\n"; continue; }
        if(N == 1) { fout << Y % MOD << "\n"; continue; }
        if(N == 2) { fout << Z % MOD << "\n"; continue; }

        Matrice m = { {A, B, C}, {1, 0, 0}, {0, 1, 0} };
        Matrice rez;
        exponentiere(m, N - 2, rez);

        ll iepuri = (Z % MOD * rez[0][0] % MOD
                   + Y % MOD * rez[0][1] % MOD
                   + X % MOD * rez[0][2] % MOD) % MOD;
        fout << iepuri << "\n";
    }
    return 0;
}