Cod sursa(job #140923)

Utilizator scvalexAlexandru Scvortov scvalex Data 22 februarie 2008 14:08:09
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

int M[3][3];

void matprint(int M[3][3]) {
	for (int i(0); i < 3; ++i) {
		for (int j(0); j < 3; ++j)
			cout << M[i][j] << " ";
		cout << endl;
	}
	cout << endl;
}

void matmul(int a[3][3], int b[3][3]) {
	int c[3][3];
	for (int i(0); i < 3; ++i)
		for (int j(0); j < 3; ++j) {
			c[i][j] = 0;
			for (int k(0); k < 3; ++k)
				c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % 666013;
		}
	memcpy(a, c, 9*sizeof(c[0][0]));
}

void bfpow(int M[3][3], int N) {
	int a[3][3];
	memcpy(a, M, 9*sizeof(M[0][0]));
	while (N--)
		matmul(M, a);
}

int main(int argc, char *argv[]) {
	ifstream fin("iepuri.in");
	fin >> T;
	ofstream fout("iepuri.out");
	while (T--) {
		fin >> X >> Y >> Z >> A >> B >> C >> N;
		
		M[0][0] = A; M[0][1] = B; M[0][2] = C;
		M[1][0] = 1; M[1][1] = 0; M[1][2] = 0;
		M[2][0] = 0; M[2][1] = 1; M[2][2] = 0;

		if (N == 1)
			fout << X % 666013 << endl;
		else if (N == 2)
			fout << Y % 666013 << endl;
		else if (N == 3)
			fout << Z % 666013 << endl;
		else {
			bfpow(M, N - 3);

			fout << (M[0][0] * X + M[0][1] * Y + M[0][2] * Z) % 666013 << endl;
		}
	}
	fout.close();
	fin.close();

	return 0;
}