Cod sursa(job #2495744)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 19 noiembrie 2019 19:50:03
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#define MOD 666013

using namespace std;

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

struct matrice
{
    long long m[3][3];
};

matrice a, b;
int t, X, Y, Z, A, B, C, n;

matrice ridicare_la_putere_matrice ( matrice A, int nr );
matrice inmultire_matrici3 ( matrice A, matrice B );

int main()
{
    fin >> t;
    for ( ; t-- ; )
    {
        fin >> X >> Y >> Z >> A >> B >> C >> n;

        a.m[0][0] = A, a.m[0][1] = B, a.m[0][2] = C;
        a.m[1][0] = 1, a.m[1][1] = 0, a.m[1][2] = 0;
        a.m[2][0] = 0, a.m[2][1] = 1, a.m[2][2] = 0;

        b.m[0][0] = Z, b.m[0][1] = 0, b.m[0][2] = 0;
        b.m[1][0] = Y, b.m[1][1] = 0, b.m[1][2] = 0;
        b.m[2][0] = X; b.m[2][1] = 0, b.m[2][2] = 0;

        a = ridicare_la_putere_matrice ( a, n - 2 );
        b = inmultire_matrici3 ( a, b );

        fout << b.m[0][0] << '\n';
    }

    return 0;
}

matrice ridicare_la_putere_matrice ( matrice A, int nr )
{
    if ( nr == 1 ) return A;
    else if ( nr % 2 == 0 ) return ridicare_la_putere_matrice ( inmultire_matrici3 ( A, A ), nr / 2 );
    else return inmultire_matrici3 ( A, ridicare_la_putere_matrice ( inmultire_matrici3 ( A, A ), nr / 2 ) );
}

matrice inmultire_matrici3 ( matrice A, matrice B )
{
    matrice C;

    C.m[0][0] = ( ( A.m[0][0] * B.m[0][0] ) % MOD + ( A.m[0][1] * B.m[1][0] ) % MOD + ( A.m[0][2] * B.m[2][0] ) % MOD ) % MOD;
    C.m[0][1] = ( ( A.m[0][0] * B.m[0][1] ) % MOD + ( A.m[0][1] * B.m[1][1] ) % MOD + ( A.m[0][2] * B.m[2][1] ) % MOD ) % MOD;
    C.m[0][2] = ( ( A.m[0][0] * B.m[0][2] ) % MOD + ( A.m[0][1] * B.m[1][2] ) % MOD + ( A.m[0][2] * B.m[2][2] ) % MOD ) % MOD;

    C.m[1][0] = ( ( A.m[1][0] * B.m[0][0] ) % MOD + ( A.m[1][1] * B.m[1][0] ) % MOD + ( A.m[1][2] * B.m[2][0] ) % MOD ) % MOD;
    C.m[1][1] = ( ( A.m[1][0] * B.m[0][1] ) % MOD + ( A.m[1][1] * B.m[1][1] ) % MOD + ( A.m[1][2] * B.m[2][1] ) % MOD ) % MOD;
    C.m[1][2] = ( ( A.m[1][0] * B.m[0][2] ) % MOD + ( A.m[1][1] * B.m[1][2] ) % MOD + ( A.m[1][2] * B.m[2][2] ) % MOD ) % MOD;

    C.m[2][0] = ( ( A.m[2][0] * B.m[0][0] ) % MOD + ( A.m[2][1] * B.m[1][0] ) % MOD + ( A.m[2][2] * B.m[2][0] ) % MOD ) % MOD;
    C.m[2][1] = ( ( A.m[2][0] * B.m[0][1] ) % MOD + ( A.m[2][1] * B.m[1][1] ) % MOD + ( A.m[2][2] * B.m[2][1] ) % MOD ) % MOD;
    C.m[2][2] = ( ( A.m[2][0] * B.m[0][2] ) % MOD + ( A.m[2][1] * B.m[1][2] ) % MOD + ( A.m[2][2] * B.m[2][2] ) % MOD ) % MOD;

    return C;
}