Cod sursa(job #143803)

Utilizator oumbraPaul Filimoon oumbra Data 26 februarie 2008 21:16:44
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

long X, Y, Z, A, B, C, N, T;
long M[3][3];
long M_N[3][3];
long M_NEW[3][3];

int X1, X2, X3;

void read()
{
	scanf("%ld%ld%ld%ld%ld%ld%ld", &X, &Y, &Z, &A, &B, &C, &N);
}

void multM()
{
	int i, j, k, l;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			M_NEW[i][j] = 0;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			for(k=0; k<3; k++)
				M_NEW[i][j] += M[i][k]*M[k][j];

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			M[i][j] = M_NEW[i][j];
}

void multMM()
{
	int i, j, k;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			M_NEW[i][j] = 0;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			for(k=0; k<3; k++)
				M_NEW[i][j] += M[i][k]*M_N[k][j];

	for(i=0; i<3; i++)
		for(j=0; j<3; j++)
			M[i][j] = M_NEW[i][j];
}

void putM(int n)
{
	if(n > 1)
	{
	if(n%2)
	{
		putM((n-1)/2);
		multM();
		multMM();
	}
	else
	{
		putM(n/2);
		multM();
	}
	}
}

void solve()
{
	M[0][0] = M_N[0][0] = 0;
	M[0][1] = M_N[0][1] = 1;
	M[0][2] = M_N[0][2] = 0;
	M[1][0] = M_N[1][0] = 0;
	M[1][1] = M_N[1][1] = 0;
	M[1][2] = M_N[1][2] = 1;
	M[2][0] = M_N[2][0] = C;
	M[2][1] = M_N[2][1] = B;
	M[2][2] = M_N[2][2] = A;

	putM(N-2);
}
int main()
{

	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);

	scanf("%d", &T);

	while(T)
	{
	read();
	solve();

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

	T--;
	}
	return 0;
}