Cod sursa(job #3142789)

Utilizator SSKMFSS KMF SSKMF Data 24 iulie 2023 15:01:42
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
using namespace std;

ifstream cin ("iepuri.in");
ofstream cout ("iepuri.out");

const int mod = 666013;

struct Matrice {
    long long valori[3][3];
    Matrice operator * (Matrice factor) {
        Matrice rezultat;
        for (int linie = 0 ; linie <= 2 ; linie++)
            for (int coloana = 0 ; coloana <= 2 ; coloana++) {
                rezultat.valori[linie][coloana] = 0;
                for (int indice = 0 ; indice <= 2 ; indice++)
                    (rezultat.valori[linie][coloana] += (*this).valori[linie][indice] * factor.valori[indice][coloana] % mod) %= mod;
            }

        return rezultat;
    }
};

Matrice Exponentiere (Matrice baza , int exponent)
{
    if (exponent == 1)
        return baza;

    Matrice factor = Exponentiere(baza , exponent >> 1);
    if (exponent & 1) return factor * factor * baza;
    return factor * factor;
}

int main ()
{
    int teste;
    cin >> teste;

    for (int test = 1 , termen[3] , factor[3] , zi ; test <= teste ; test++) {
        cin >> termen[0] >> termen[1] >> termen[2] >> factor[0] >> factor[1] >> factor[2] >> zi;
        if (zi <= 3) cout << termen[zi - 1] << '\n';
        else {
            Matrice rezultat;
            for (int linie = 0 ; linie <= 2 ; linie++)
                rezultat.valori[linie][0] = factor[linie] , rezultat.valori[linie][1] = rezultat.valori[linie][2] = 0;

            rezultat.valori[0][1] = rezultat.valori[1][2] = 1; rezultat = Exponentiere(rezultat , zi - 2);
            cout << ((termen[2] * rezultat.valori[0][0] % mod + termen[1] * rezultat.valori[1][0] % mod) % mod + termen[0] * rezultat.valori[2][0] % mod) % mod << '\n';
        } 
    }

    cout.close(); cin.close();
    return 0;
}