Cod sursa(job #3352191)

Utilizator TudorPetTudor Petrescu TudorPet Data 24 aprilie 2026 20:18:09
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
using namespace std;
ifstream fin("iepuri.in");
ofstream fout("iepuri.out");
struct Matrice {
    long long mat[3][3];

    // Constructor pentru a initializa cu 0
    Matrice() {
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                mat[i][j] = 0;
    }
};
Matrice multiply(Matrice A, Matrice B) {
    Matrice C;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                C.mat[i][j] = (C.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % 666013;
                // Inmultirea matricilor
            }
        }
    }
    return C;
}
Matrice putere(Matrice M, int p) {
    Matrice rez; // Ceea ce este un "element neutru", Matricea Identitate !!!!
    rez.mat[0][0] = 1; rez.mat[1][1] = 1; rez.mat[2][2] = 1;

    while (p > 0) {
        if (p % 2 == 1) {
            rez = multiply(rez, M);
        }
        M = multiply(M, M);
        p /= 2;
    }
    return rez;
}

int main() {
    int t;
    fin>>t;
    for(int i=0;i<t;i++) {
        long long x, y, z, a, b, c, n;
        fin>>x>>y>>z>>a>>b>>c >> n;
        Matrice start; // Coef in matrice 3x3
        start.mat[0][0] = a % 666013; start.mat[0][1] = b % 666013; start.mat[0][2] = c % 666013; // Ziua curenta
        start.mat[1][0] = 1; start.mat[1][1] = 0; start.mat[1][2] = 0; // Ziua trecuta
        start.mat[2][0] = 0; start.mat[2][1] = 1; start.mat[2][2] = 0; // Ziua n-2
        // Matricea start trebuie ridicata la puterea n - 2, pentru ca plecam de la ziua 2

        start = putere(start, n - 2); // O sa fie coeficientii in matrice

        long long raspuns = (start.mat[0][0] * z + start.mat[0][1] * y + start.mat[0][2] * x) % 666013;
        fout<<raspuns << '\n';
    }
}