Cod sursa(job #570782)

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

inline void times(int A[4][4],int B[4][4],int C[4][4], int n, int m, int q) {
	int i, j, k;
//	memset(C, 0, sizeof(C));
	for(i = 1; i <= m; ++i)
		for(j = 1; j <= q; ++j)
			C[i][j] = 0;
	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;
			}
}

inline void exp(int w, int C[4][4], int n, int m) {
	int pow[4][4], B[4][4];
	int i, j;

	for(i = 1; i <= n; ++i)
		for(j = 1; j <= m; ++j)
			pow[i][j] = A[i][j];

	for(int step = 1; step <= w; step *= 2) {
		if(step & w){
		/*	for(i = 1; i <= n; ++i)
				for(j = 1; j <= m; ++j)
					B[i][j] = 0;
		*/	times(C, pow, B, n, m, m);
			for(i = 1; i <= n; ++i)
				for(j = 1; j <= m; ++j)
					C[i][j] = B[i][j];
		}

		
		times(pow, pow, B, n, m, m);
		
		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);
		
		for(i = 1; i <= 3; ++i)
			for(j = 1; j <= 3; ++j)
				A[i][j] = R[i][j] = 0;
		R[1][1] = x;	R[1][2] = y;	R[1][3] = z;
		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);
				
		printf("%d\n", R[1][3]);
	}

	return 0;
}