Cod sursa(job #238263)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 1 ianuarie 2009 15:07:31
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>
#include <math.h>

#define MOD 666013

long x, y, z, A, B, C, i, j, k, n, a[4][4], t, rez, b[4][4], nr, c[4][4], q, r;

void mul(long ex);

int main() {
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);
	scanf("%ld", &t);
	while (t--)	{
		scanf("%ld %ld %ld %ld %ld %ld %ld", &x, &y, &z, &A, &B, &C, &n);
		a[1][1] = 0;a[1][2] = 1;a[1][3] = 0;
		a[2][1] = 0;a[2][2] = 0;a[2][3] = 1;
		a[3][1] = C;a[3][2] = B;a[3][3] = A;
		for (i = 1; i <= 3; ++i) {
			for (j = 1; j <= 3; ++j) {
				b[i][j] = a[i][j];
				c[i][j] = 0;
			}
		}
		mul(n - 1);
		a[1][1] = x;a[1][2] = 0;a[1][3] = 0;
		a[2][1] = y;a[2][2] = 0;a[2][3] = 0;
		a[3][1] = z;a[3][2] = 0;a[3][3] = 0;
		for (i = 1; i <= 3; ++i) {
			for (j = 1; j <= 3; ++j) {
				c[i][j] = 0;
			}
		}
		for (i = 1; i <= 3; ++i) {
			for (j = 1; j <= 3; ++j) {
				for (k = 1; k <= 3; ++k) {
					c[i][j] = ((c[i][j] % MOD) + ((b[i][k] % MOD) * (a[k][j] % MOD)) % MOD) % MOD;
				}
			}
		}
		printf("%ld\n", c[1][1]);
	}
	return 0;
}

void mul(long ex) {
	long i, j, k;
	rez = 0;
	while (ex) {
		if (ex % 2 == 0) {
			for (i = 1; i <= 3; ++i) {
				for (j = 1; j <= 3; ++j) {
					for (k = 1; k <= 3; ++k) {
						c[i][j] = ((c[i][j] % MOD) + ((a[i][k] % MOD) * (a[k][j] % MOD)) % MOD) % MOD;
					}
				}
			}
			for (i = 1; i <= 3; ++i) {
				for (j = 1; j <= 3; ++j) {
					a[i][j] = c[i][j];
				}
			}
			ex /= 2;
		} else {
			for (i = 1; i <= 3; ++i) {
				for (j = 1; j <= 3; ++j) {
					for (k = 1; k <= 3; ++k) {
						c[i][j] = ((c[i][j] % MOD) + ((a[i][k] % MOD) * (b[k][j] % MOD)) % MOD) % MOD;
					}
				}
			}
			for (i = 1; i <= 3; ++i) {
				for (j = 1; j <= 3; ++j) {
					b[i][j] = c[i][j];
				}
			}
			--ex;
		}
		for (i = 1; i <= 3; ++i) {
			for (j = 1; j <= 3; ++j) {
				c[i][j] = 0;
			}
		}
	}
}