Cod sursa(job #604374)

Utilizator razyelxrazyelx razyelx Data 22 iulie 2011 01:54:51
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#	include <fstream>

using namespace std;

const int prim = 666013;

long long M[3][3], R[3][3], AUX[3][3], n, x, y, z, a, b, c, k, r;

int main(){
	
	
	ifstream fin ("iepuri.in");
	ofstream fout("iepuri.out");
	
	fin >> k;
	
	while ( k ){
		
		fin >> x >> y >> z >> a >> b >> c >> n;
		
		
		R[0][0] = 1; R[0][1] = 0; R[0][2] = 0;
		R[1][0] = 0; R[1][1] = 1; R[1][2] = 0;
		R[2][0] = 0; R[2][1] = 0; R[2][2] = 1;	
			
		int p = n, i;
				
		for (; p; p -= 1 << (i - 1)) {
			
			M[0][0] = 0; M[0][1] = 1; M[0][2] = 0;
			M[1][0] = 0; M[1][1] = 0; M[1][2] = 1;
			M[2][0] = c; M[2][1] = b; M[2][2] = a;			
			
			for (i = 1; (1 << i) <= p; i++) {
							
				AUX[0][0] = ( M[0][0] * M[0][0] + M[0][1] * M[1][0] + M[0][2] * M[2][0] ) % prim;
				AUX[0][1] = ( M[0][0] * M[0][1] + M[0][1] * M[1][1] + M[0][2] * M[2][1] ) % prim;
				AUX[0][2] = ( M[0][0] * M[0][2] + M[0][1] * M[1][2] + M[0][2] * M[2][2] ) % prim;
				
				AUX[1][0] = ( M[1][0] * M[0][0] + M[1][1] * M[1][0] + M[1][2] * M[2][0] ) % prim;
				AUX[1][1] = ( M[1][0] * M[0][1] + M[1][1] * M[1][1] + M[1][2] * M[2][1] ) % prim;
				AUX[1][2] = ( M[1][0] * M[0][2] + M[1][1] * M[1][2] + M[1][2] * M[2][2] ) % prim;
				
				AUX[2][0] = ( M[2][0] * M[0][0] + M[2][1] * M[1][0] + M[2][2] * M[2][0] ) % prim;
				AUX[2][1] = ( M[2][0] * M[0][1] + M[2][1] * M[1][1] + M[2][2] * M[2][1] ) % prim;
				AUX[2][2] = ( M[2][0] * M[0][2] + M[2][1] * M[1][2] + M[2][2] * M[2][2] ) % prim;
				
				for (int j = 0; j < 3; j++)
					for ( int jj = 0 ; jj < 3; jj++)
						M[j][jj] = AUX[j][jj];
			
			}
			
			AUX[0][0] = ( R[0][0] * M[0][0] + R[0][1] * M[1][0] + R[0][2] * M[2][0] ) % prim;
			AUX[0][1] = ( R[0][0] * M[0][1] + R[0][1] * M[1][1] + R[0][2] * M[2][1] ) % prim;
			AUX[0][2] = ( R[0][0] * M[0][2] + R[0][1] * M[1][2] + R[0][2] * M[2][2] ) % prim;
				
			AUX[1][0] = ( R[1][0] * M[0][0] + R[1][1] * M[1][0] + R[1][2] * M[2][0] ) % prim;
			AUX[1][1] = ( R[1][0] * M[0][1] + R[1][1] * M[1][1] + R[1][2] * M[2][1] ) % prim;
			AUX[1][2] = ( R[1][0] * M[0][2] + R[1][1] * M[1][2] + R[1][2] * M[2][2] ) % prim;
				
			AUX[2][0] = ( R[2][0] * M[0][0] + R[2][1] * M[1][0] + R[2][2] * M[2][0] ) % prim;
			AUX[2][1] = ( R[2][0] * M[0][1] + R[2][1] * M[1][1] + R[2][2] * M[2][1] ) % prim;
			AUX[2][2] = ( R[2][0] * M[0][2] + R[2][1] * M[1][2] + R[2][2] * M[2][2] ) % prim;
			
			
			for (int j = 0; j < 3; j++)
				for ( int jj = 0 ; jj < 3; jj++)
					R[j][jj] = AUX[j][jj];
							
		
		}
		
		r = ( R[0][0] * x + R[0][1] * y + R[0][2] * z ) % prim;
		
		fout << r << "\n";
		
		k--;
	}
	
	return 0;
	
	
}