Cod sursa(job #570774)

Utilizator cosmyoPaunel Cosmin cosmyo Data 3 aprilie 2011 16:23:45
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = 666013;
int A[5][5], a, b, c, x, y, z, n, t, R[5][5], T[5][5];

void times(int A[5][5],int B[5][5],int C[5][5], int n, int m, int q) {
	int i, j, k;
	memset(C, 0, sizeof(C));
	for(k = 1; k <= m; ++k) 
		for(i = 1; i <= n; ++i)
			for(j = 1; j <= q; ++j){
				C[i][j] += ((long long)A[i][k] * B[k][j]) % MOD;
				if(C[i][j] > MOD)
					C[i][j] -= MOD;
			}
}

void exp(int w, int C[5][5], int n, int m) {
	int pow[5][5], B[5][5];
	int i, j;
	memset(C, 0, sizeof(C));
	memset(B, 0, sizeof(B));
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= m; ++j)
			pow[i][j] = A[i][j];
	for(i = 1; i <= n; ++i)
		C[i][i] = 1;

	for(int step = 1; step <= w; step *= 2) {
		if(step & w){
			memset(B, 0, sizeof(B));
			times(C, pow, B, n, m, m);
			memcpy(C, B, sizeof(B));
		}

		memset(B, 0, sizeof(B));
		times(pow, pow, B, n, m, m);
		memcpy(pow, B, sizeof(B));
		/*
		for(i = 1; i <= n; ++i)
			for(j = 1; j <= m; ++j)
				pow[i][j] = B[i][j];
		*/
		}
}

int main() {
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%d", &t);
	int i, j;
	
	for(;t; --t) {
		scanf("%d %d %d %d %d %d %d", &x, &y, &z, &a, &b, &c, &n);
		
		memset(A, 0, sizeof(A));
		memset(R, 0, sizeof(R));
		
		A[1][3] = c;	A[2][1] = 1;	A[2][3] = b;	A[3][2] = 1;	A[3][3] = a;
		
		exp(n - 2, R, 3, 3);
		
		memset(A, 0, sizeof(A));
		A[1][1] = x;	A[1][2] = y;	A[1][3] = z;
		/*	
		for(i = 1; i <= 3; ++i){
			for(j = 1; j <= 3; ++j)
				printf("%d ", R[i][j]);
			printf("\n");
		}
		*/
		memset(T, 0, sizeof(T));
		times(A, R, T, 1, 3, 3);
		
		printf("%d\n", T[1][3]);
	}

	return 0;
}