Cod sursa(job #803485)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 27 octombrie 2012 17:38:09
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>

#define MOD 666013

long long M[4][4], sol[4][4], C[4][4], N, rez;
int T;
int x, y, z;
int a, b, c;

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

void put(long long P) {
	
	for(; P; P>>=1) {
		if(P&1)
			inmult_mat(sol, M);
		inmult_mat(M, M);
	}
}

void init_data() {
	
	scanf("%d %d %d %d %d %d %lld",&x,&y,&z,&a,&b,&c,&N);
	M[3][1] = c;
	M[3][2] = b;
	M[3][3] = a;
	M[1][2] = M[2][3] = 1;
		
	sol[1][1] = sol[2][2] = sol[3][3] = 1;
	
	N-=2;
}

void reset_data() {

	int i, j;
	for(i=1; i<=3; i++)
		for(j=1; j<=3; j++)
			M[i][j] = sol[i][j] = 0;
	rez = 0;
}

int main() {
	
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	
	scanf("%d",&T);
	while(T--) {
		init_data();
		put(N);
		rez = (sol[3][1] * x * 1LL)%MOD + (sol[3][2] * y * 1LL)%MOD + (sol[3][3] * z * 1LL)%MOD;
		printf("%lld\n",rez);
		reset_data();
	}
	
	return 0;
}