Cod sursa(job #159247)

Utilizator city_guy91alex isip city_guy91 Data 14 martie 2008 00:13:56
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstring>
const long long MOD = 666013;

long long A[3][3] = { {0,1,0}, {0,0,1}, {0,0,0} };
long long P[3][3];

void product(const long long (&A)[3][3], const long long (&B)[3][3], long long C[3][3]) {
	long long tmp[3][3];
	for (long long i=0; i<3; ++i)
		for (long long j=0; j<3; ++j) {
			tmp[i][j] = 0;
			for (long long k=0; k<3; ++k)
				tmp[i][j] = (tmp[i][j] + A[i][k]*B[k][j] % MOD) % MOD;
		}
	for (long long i=0; i<3; ++i)
		for (long long j=0; j<3; ++j)
			C[i][j] = tmp[i][j] % MOD;
}
void print(long long a[3][3]) {
	for (long long i=0; i<3; ++i) {
		for (long long j=0; j<3; ++j)
			printf("%lld ", a[i][j]);
		printf("\n");
	}
}
void putere(long long n) {
	if ( n&1 ) {
    	memcpy(P, A, sizeof(P));
    } else {
		memset(P, 0, sizeof(P));
		P[1][1] = P[2][2] = P[0][0] = 1;
    }
	long long pow[3][3];
    memcpy(pow, A, sizeof(A));
	for (long long i=2; i<=n; i<<=1) {
		product(pow, pow, pow);
		if ( n&i )
			product(P, pow, P);
	}
}

int main() {
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);

	long long T;
	scanf("%lld", &T);
	while ( T-- ) {
		long long x,y,z,a,b,c,n;
		scanf("%lld %lld %lld %lld %lld %lld %lld", &x,&y,&z,&a,&b,&c,&n);
		A[0][0] = a, A[1][0] = b, A[2][0] = c;
		putere(n-2);
//		print(P);
		printf("%lld\n", ( (P[0][0]*z) % MOD + (P[1][0]*y) % MOD + (P[2][0]*x) % MOD ) % MOD);
//		printf("\n");
	}
	return 0;
}