Cod sursa(job #706020)

Utilizator Catah15Catalin Haidau Catah15 Data 5 martie 2012 13:33:43
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

#define MOD 666013
#define int64 long long

int M[5][5], sol[5][5];
int O3[5][5];


void cpy (int B[5][5], int C[5][5])
{
	for (int i = 1; i <= 3; ++ i)
		for (int j = 1; j <= 3; ++ j) B[i][j] = C[i][j];
}


void mul (int B[5][5], int C[5][5])
{
	int aux2[5][5];
	
	cpy (aux2, O3);
	
	for (int l = 1; l <= 3; ++ l)
		for (int c = 1; c <= 3; ++ c)
			for (int i = 1; i <= 3; ++ i)
			{
				aux2[l][c] += B[l][i] * C[i][c];
				if (aux2[l][c] > MOD) aux2[l][c] %= MOD;
			}

	cpy (B, aux2);
}


void Lg_Pow (int64 P)
{
	if (P == 1)
	{
		cpy (sol, M);
		return;
	}
	
	Lg_Pow (P / 2);
	
	if (P % 2) 
	{
		mul (sol, sol);
		mul (sol, M);
	}
	else mul (sol, sol);
}


int main()
{
	freopen ("iepuri.in", "r", stdin);
	freopen ("iepuri.out", "w", stdout);
	
	int T;
	
	scanf ("%d", &T);
	
	while (T --)
	{
		int X, Y, Z, A, B, C;
		int64 N;
		
		scanf ("%d %d %d", &X, &Y, &Z);
		scanf ("%d %d %d", &A, &B, &C);
		scanf ("%lld", &N);
		
		M[1][1] = M[1][2] = M[2][2] = M[3][1] = 0;
		M[2][1] = M[3][2] = 1;
		M[1][3] = C, M[2][3] = B, M[3][3] = A;
		
		Lg_Pow (N - 2);
		
		int ans = ((((X * sol[1][3]) % MOD) + Y * sol[2][3]) % MOD) + Z * sol[3][3];
		if (ans > MOD) ans %= MOD;
		
		printf ("%d\n", ans);
	}
	
	return 0;
}