Cod sursa(job #230232)

Utilizator webspiderDumitru Bogdan webspider Data 13 decembrie 2008 12:33:54
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <iostream>

typedef long long matr[ 4 ][ 4 ];

int X, Y, Z, A, B, C;
int T, N;

const int MOD = 666013;

void inmMat( matr &dest, matr A, matr B, int N ) {
	matr aux; memset( aux, 0, sizeof( aux ) );
	for ( int k = 1; k <= N; k++ ) 
		for ( int i = 1; i <= N; i++ )
			for ( int j = 1; j <= N; j++ )
				aux[ i ][ j ] = ( aux[ i ][ j ] + A[ i ][ k ]*B[ k ][ j ] ) % MOD;		
	memcpy( dest, aux, sizeof( aux ) );
}

matr S, D;
long long Sol;
int main() 
{
#ifndef PC_RUN 
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
#else
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
#endif
	
	for ( scanf("%d\n", &T); T; --T ) {
		scanf("%d %d %d %d %d %d %d\n", &X, &Y, &Z, &A, &B, &C, &N  );
		memset( D, 0, sizeof( D ) );
		memset( S, 0, sizeof( S ) );		
		D[ 2 ][ 1 ] = 1;
		D[ 3 ][ 2 ] = 1;
		D[ 1 ][ 3 ] = C;
		D[ 2 ][ 3 ] = B;
		D[ 3 ][ 3 ] = A;

		N -= 2;

		S[ 1 ][ 1 ] = 1; S[ 2 ][ 2 ] = 1; S[ 3 ][ 3 ] = 1;

		for ( int i = 0; i <= 31; i++ ) {
			if ( N&(1<<i) ) { inmMat( S, S, D, 3 ); }
			inmMat( D, D, D, 3 );
		}
		Sol = X * S[ 1 ][ 3 ] + Y * S[ 2 ][ 3 ] + Z * S[ 3 ][ 3 ];
		printf("%lld\n", Sol );
	}

	return 0;
}