Cod sursa(job #173212)

Utilizator vlad.maneaVlad Manea vlad.manea Data 7 aprilie 2008 15:16:35
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#define MOD 666013

struct matrice
{
	long long F[3][3];
};

matrice U, D, R;

long long C, X, Y, Z, A, B, N, T;

matrice prod(struct matrice M, struct matrice P, int I, int J, int K)
{
	int i, j, k;

	struct matrice R;

	for (i = 0; i < I; ++i)
		for (j = 0; j < J; R.F[i][j] %= MOD, ++j)
			for (k = R.F[i][j] = 0; k < K; ++k)
				R.F[i][j] += (M.F[i][k] * P.F[k][j]) % MOD;

	return R;
}

struct matrice calc(int N)
{
	struct matrice R;

	int m;

	if (N == 1)
	{
		U.F[0][0] = 0;
		U.F[0][1] = 0;
		U.F[0][2] = C % MOD;
		U.F[1][0] = 1;
		U.F[1][1] = 0;
		U.F[1][2] = B % MOD;
		U.F[2][0] = 0;
		U.F[2][1] = 1 % MOD;
		U.F[2][2] = A;
		return U;
	}

	m = N>>1;

	R = calc(m);

	R = prod(R, R, 3, 3, 3);

	if (N%2)
		R = prod(R, U, 3, 3, 3);

	return R;
}

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

	scanf("%d", &T);

	while (T--)
	{
		scanf("%lld%lld%lld%lld%lld%lld%lld", &X, &Y, &Z, &A, &B, &C, &N);

		R = calc(N);

		D.F[0][0] = X % MOD;
		D.F[0][1] = Y % MOD;
		D.F[0][2] = Z % MOD;

		R = prod(D, R, 1, 3, 3);

		printf("%lld\n", R.F[0][0] % MOD);
	}
}

int main()
{
	solve();

	return 0;
}