Cod sursa(job #1892875)

Utilizator petrooPetru G petroo Data 25 februarie 2017 12:47:11
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>


const int modulo = 666013;
int M[3][3];
int M1[3][3];
void multiply(int M1[3][3], int M2[3][3]) {

	int square[3][3];

	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 3; j++) {

			long long value = 0;
			for(int k = 0; k < 3; k++)
				value += (M1[i][k] * M2[k][j]) % modulo;
			square[i][j] = value;
		}
	}
	for(int i = 0; i < 3; i++)
		for(int j = 0; j < 3; j++)
			M[i][j] = square[i][j];
}


void solve(int p, int X, int Y, int Z) {

	bool impar = p & 1;

	while (p > 1) {
		multiply(M, M);
		p >>= 1;
	}

	if(impar) 
		multiply(M, M1);

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

}

int main() {


	int T, X, Y, Z, A, B, C, N;     	
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d", &T);
	for(int i = 0; i < T; i++) {
		
		scanf("%d %d %d %d %d %d %d \n", &X, &Y, &Z, &A, &B, &C, &N);
		M[0][0] = M1[0][0] = 0; M[0][1] = M1[0][1] = 1; M[0][2] = M1[0][2] = 0;
		M[1][0] = M1[1][0] = 0; M[1][1] = M1[1][1] = 0; M[1][2] = M1[1][2] = 1;
		M[2][0] = M1[2][0] = C; M[2][1] = M1[2][1] = B; M[2][2] = M1[2][2] = A;
		solve(N, X, Y, Z);
		
	}

	return 0;
}