Cod sursa(job #290536)

Utilizator rupraRupra C rupra Data 28 martie 2009 01:42:48
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <algorithm>
#include <stdio.h>

#define restRez 666013

using namespace std;

int matCalc[4][4];
int testCases;

void inmultesteMatrice(int (&matProdus)[4][4], int matFact[4][4])
{
	int matTemp[4][4];
	memset(matTemp, 0, sizeof(matTemp));
	
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			for (int k = 1; k <= 3; k++)
				matTemp[i][j] += matProdus[i][k] * matFact[k][j];
			
	memcpy(matProdus, matTemp, sizeof(matProdus));
}

void ridica(int (&matCalc)[4][4], int x)
{
	int r[4][4];
	memset(r, 0, sizeof(r));
	r[1][1] = r[2][2] = r[3][3] = 1;
	
	for (; x > 1; x /= 2)
	{
		if (x & 1)
			inmultesteMatrice(r, matCalc);
		
		inmultesteMatrice(matCalc, matCalc);
	}
	
	inmultesteMatrice(matCalc, r);
}	

int main()
{
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	
	
	for (scanf("%d", &testCases); testCases; testCases--)
	{
		int x, y, z, n;
		memset(matCalc, 0, sizeof(matCalc));
		matCalc[1][2] = matCalc[2][3] = 1;
		
		scanf("%d %d %d", &x, &y, &z);
		scanf("%d %d %d", &matCalc[3][3], &matCalc[3][2], &matCalc[3][1]);
		scanf("%d", &n);
		
		ridica(matCalc, n);
		
		int sol = (matCalc[1][1] * x) % restRez + (matCalc[1][2] * y) % restRez + (matCalc[1][3] * z) % restRez;
		
		printf("%d\n", sol % restRez);		
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}