Cod sursa(job #1194770)

Utilizator taigi100Cazacu Robert taigi100 Data 4 iunie 2014 19:20:20
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
/*
	Keep It Simple!
*/

#include<fstream>
using namespace std;

#define MOD 666013

long long T, A[4], B[4], N,M[4][4];

void Multiply(long long X[4][4], long long Y[4][4])
{
	long long aux[4][4];
	memset(aux, 0, sizeof(aux));
	for (int i = 1; i <= 3; i++)
	for (int j = 1; j <= 3; j++)
	for (int k = 1; k <= 3; k++)
	{
		aux[i][j] = (aux[i][j] + X[i][k] * Y[k][j])%MOD;
	}
		memcpy(X, aux, sizeof(aux));
}

void LogPow(int P)
{
	long long sol[4][4];
	memset(sol, 0, sizeof(sol));
	sol[1][1] = sol[2][2] = sol[3][3] = 1;

	while (P)
	{
		if (P % 2)
			Multiply(sol, M);
		Multiply(M, M);
		P /= 2;
	}
	memcpy(M, sol, sizeof(sol));
}

int main()
{
	ifstream f("iepuri.in");
	ofstream g("iepuri.out");

	f >> T;

	while (T--)
	{
		for (int i = 1; i <= 3; i++) f >> A[i];
		for (int i = 1; i <= 3; i++) f >> B[i];
		f >> N;
		
		memset(M, 0, sizeof(M));
		M[1][2] = M[2][3] = 1;
		for (int i = 1; i <= 3; i++) M[3][i] = B[3 - i + 1];
		LogPow(N);
		A[1] = ((M[1][1] * A[1])%MOD + (M[1][2] * A[2])%MOD + (M[1][3] * A[3])%MOD)%MOD;
		g << A[1] << '\n';
	}

	f.close();
	g.close();
	return 0;
}