Cod sursa(job #2593631)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 4 aprilie 2020 12:32:51
Problema Iepuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <iostream>
#include <fstream>

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

const int MOD = 666013;

long long a[4][4];
long long rez[4][4];

void product ( long long dest[4][4], long long p[4][4] ) {
    long long aux[4][4];

    for ( int x = 1; x <= 3; ++x )
        for ( int y = 1; y <= 3; ++y )
            aux[x][y] = 0;

    for ( int k = 1; k <= 3; ++k )
        for ( int x = 1; x <= 3; ++x )
            for ( int y = 1; y <= 3; ++y )
                aux[k][x] += dest[k][y] * p[y][x] % MOD;
    
    for ( int x = 1; x <= 3; ++x )
        for ( int y = 1; y <= 3; ++y )
            dest[x][y] = aux[x][y] % MOD;   
}

void matPower ( int power ) {
    while ( power ) {
        if ( power % 2 == 1 )
            product ( rez, a );
        product ( a, a );
        power /= 2;
    }
}

int main () {
    int T;

    fin >> T;

    for ( int i = 1; i <= T; ++i ) {
        int X, Y, Z, A, B, C, N;

        fin >> X >> Y >> Z >> A >> B >> C >> N;

        for ( int x = 1; x <= 3; ++x )
            for ( int y = 1; y <= 3; ++y )
                a[x][y] = rez[x][y] = 0;

        a[1][3] = C;
        a[2][1] = 1;
        a[2][3] = B;
        a[3][2] = 1;
        a[3][3] = A;
        rez[1][1] = rez[2][2] = rez[3][3] = 1;

        matPower ( N - 2 );

        long long ans =  ( X * rez[1][3] % MOD + Y * rez[2][3] % MOD + Z * rez[3][3] % MOD ) % MOD;

        fout << ans << '\n';

    }

    fin.close();
    fout.close();

    return 0;
}