Cod sursa(job #423865)

Utilizator piroslPiros Lucian pirosl Data 24 martie 2010 13:07:50
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>

#define MOD 666013


unsigned int* mult(unsigned int* m1, unsigned int* m2)
{
	unsigned int* res = new unsigned int[9];

	for(int i=0;i<3;++i)
	{
		for(int j=0;j<3;++j)
		{
			res[i*3+j] = 0;
			for(int k=0;k<3;++k)
				res[i*3+j] += (((long)(m1[i*3+k]))*m2[k*3+j]) % MOD;
			res[i*3+j] %= MOD;
		}
	}

/*	for(i=0;i<3;++i)
	{
		for(int j=0;j<3;++j)
			printf("%d ", res[i*3+j]);
		printf("\n");
	}
*/	return res;
}

unsigned int* matpow(unsigned int* matr, int p)
{
	if(p == 1)
	{
		unsigned int* res = new unsigned int[9];
		for(int i=0;i<9;++i)
			res[i] = matr[i];
		return res;
	}
	if(p%2 == 0)
	{
		unsigned int* m1 = matpow(matr, p/2);
		unsigned int* res = mult(m1, m1);
		delete[] m1;
		return res;
	}

	return mult(matr, matpow(matr, p-1));

}

int main(void)
{
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);


	int t;
	int i;
	scanf("%d", &t);
	for(i=0;i<t;++i)
	{
		int x,y,z,a,b,c,n;
		scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a ,&b, &c, &n);

		unsigned int matr[] = {0,0,c,1,0,b,0,1,a};
		unsigned int* res = matpow(matr, n-2);


		int p = (((long)x)*res[2] % MOD + ((long)y)*res[5] % MOD + ((long)z)*res[8] % MOD) % MOD;
		printf("%d\n", p);

		delete[] res;
	}

	return 0;
}