Cod sursa(job #495552)

Utilizator SpiderManSimoiu Robert SpiderMan Data 25 octombrie 2010 19:54:30
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
# include <cstdio>

const char *FIN = "iepuri.in", *FOU = "iepuri.out" ;
const int MOD = 666013;

int Mat[3][3], M[3][3] ;
int X, Y, Z, A, B, C, N, T ;

inline void mult ( int A[3][3], int B[3][3] ) {
    int C[3][3] ;
    for ( int i = 0; i < 3; ++i ) {
        for ( int j = 0; j < 3; ++j ) {
            C[i][j] = 0 ;
            for ( int k = 0; k < 3; ++k ) {
                C[i][j] += 1LL * A[i][k] * B[k][j] % MOD ;
                C[i][j] %= MOD ;
            }
        }
    }

    for ( int i = 0; i < 3; ++i ) {
        for ( int j = 0; j < 3; ++j ) {
            A[i][j] = C[i][j] ;
        }
    }
}

inline void powr ( int P, int M[3][3] ) {
    for ( int i = 0; 1 << i <= P; ++i ) {
        if ( 1 << i & P ) {
            mult ( M, Mat ) ;
        }

        mult ( Mat, Mat ) ;
    }
}

void solve ( void ){
	Mat[0][0] = A, Mat[0][1] = B, Mat[0][2] = C ;
	Mat[1][0] = 1, Mat[1][1] = 0, Mat[1][2] = 0 ;
	Mat[2][0] = 0, Mat[2][1] = 1, Mat[2][2] = 0 ;
	for ( int i = 0; i < 3; ++i ) {
	    for ( int j = 0; j < 3; ++j ) {
	        M[i][j] = i == j ? 1 : 0 ;
	    }
	}

	powr ( N - 2, M ) ;

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

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    for ( scanf ( "%d", &T ) ; T ; --T ) {
        scanf ( "%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N ) ;
        solve () ;
    }
}