Cod sursa(job #1575017)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 21 ianuarie 2016 00:48:03
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <cstdio>

const int MOD = 666013;

int N, X, Y, Z, A, B, C, T;
int Answer[3][3], Auxiliary[3][3], Constant[3][3];

inline void mul( int A[3][3], int B[3][3], int C[3][3] ) {

    for( int i = 0; i <= 2; i ++ ) {
    for( int j = 0; j <= 2; j ++ ) {
        C[i][j] = 0;

        for( int k = 0; k <= 2; k ++ )
            C[i][j] = (C[i][j] + A[i][k] * 1LL * B[k][j]) % MOD;
    }}

    return;
}

inline void cop( int A[3][3], int B[3][3] ) {

    for( int i = 0; i <= 2; i ++ )
    for( int j = 0; j <= 2; j ++ )
        A[i][j] = B[i][j];

    return;
}

int main () {

    freopen( "iepuri.in" , "r", stdin  );
    freopen( "iepuri.out", "w", stdout );

    scanf( "%d", &T );
    for( int i = 1; i <= T; i ++ ) {
        scanf( "%d %d %d", &X, &Y, &Z );
        scanf( "%d %d %d", &A, &B, &C );
        scanf( "%d", &N ); N -= 2;

        Constant[0][0] = A; Constant[0][1] = B; Constant[0][2] = C;
        Constant[1][0] = 1; Constant[1][1] = 0; Constant[1][2] = 0;
        Constant[2][0] = 0; Constant[2][1] = 1; Constant[2][2] = 0;

        Answer[0][0] = 1; Answer[0][1] = 0; Answer[0][2] = 0;
        Answer[1][0] = 0; Answer[1][1] = 1; Answer[1][2] = 0;
        Answer[2][0] = 0; Answer[2][1] = 0; Answer[2][2] = 1;

        while( N ) {

            if( N % 2 ) {
                mul( Answer, Constant, Auxiliary );
                cop( Answer, Auxiliary );
            }

            mul( Constant, Constant, Auxiliary );
            cop( Constant, Auxiliary );

            N /= 2;
        }

        printf( "%d\n", (Answer[0][0] * 1LL * Z + Answer[0][1] * 1LL * Y + Answer[0][2] * 1LL * X) % MOD );
    }

    return 0;
}