Cod sursa(job #673184)

Utilizator JBaccountCatalin JBaccount Data 4 februarie 2012 00:46:02
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>

using namespace std;

#define LL long long
#define MOD 666013
#define KM 4


void prod (int A[KM][KM], int B[KM][KM], int C[KM][KM], int K)
{
	for (int i = 1; i <= K; ++i)
		for (int j = 1; j <= K; ++j) C[i][j] = 0;
	
	for (int i = 1; i <= K; ++i)
		for (int j = 1; j <= K; ++j)
			for (int k = 1; k <= K; ++k)
				C[i][j] = ((LL)C[i][j] + (LL)A[i][k]*B[k][j]) % MOD;
}

void power (int A[KM][KM], int N, int C[KM][KM], int K)
{
	if (N == 0)
	{
		for (int i = 1; i <= K; ++i)
			for (int j = 1; j <= K; ++j)
				if (i != j) C[i][j] = 0;
				else C[i][j] = 1;
		return;
	}	
	
	int half[KM][KM], P[KM][KM];
	power (A, N/2, half, K);
	
	if (N % 2) 
	{
		prod (half, half, P, K);
		prod (P, A, C, K);
		return ;
	}	
	else
	{
		prod (half, half, C, K);
		return ;
	}	
}

int main()
{
	freopen ("iepuri.in", "r", stdin);
	freopen ("iepuri.out", "w", stdout);
	
	int T;
	scanf ("%d", &T);
	
	int M[KM][KM];
	memset (M, 0, sizeof(M));
	M[2][1] = M[3][2] = 1;
	
	while (T--)
	{
		int X, Y, Z, A, B, C, N;
		scanf ("%d %d %d %d %d %d %d", &X, &Y, &Z, &A, &B, &C, &N);
		
		M[1][3] = C;
		M[2][3] = B;
		M[3][3] = A;
		
		int ans[KM][KM];
		power (M, N, ans, 3);
		
		/*
		for (int i = 1; i <= 3; ++i)
		{
			for (int j = 1; j <= 3; ++j) printf ("%d ", ans[i][j]);
			
			printf ("\n");	
		}	
		*/
		int fans = ((LL)X*ans[1][1] + (LL)Y*ans[2][1] + (LL)Z*ans[3][1]) % MOD;
		
		printf ("%d\n", fans);
	}	
	
	return 0;
}