Cod sursa(job #2465155)

Utilizator mvcl3Marian Iacob mvcl3 Data 29 septembrie 2019 15:26:32
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<string> 
#include<array>


class Matrix {
public:
	Matrix() {
		for (int i = 0; i < 3; ++i) {
			for (int j = 0; j < 3; ++j) {
				m_arr[i][j] = 0;
			}
		}
	}

	void initMatrix(int& a, int& b, int& c) {
		m_arr[0][0] = a;
		m_arr[0][1] = b;
		m_arr[0][2] = c;

		m_arr[1][0] = m_arr[2][1] = 1;
		m_arr[1][1] = m_arr[1][2] = m_arr[2][0] = m_arr[2][2] = 0;
	}

	Matrix operator *(const Matrix& m) {
		Matrix res;
		for (int k = 0; k < 3; ++k) {
			for (int i = 0; i < 3; ++i) {
				for (int j = 0; j < 3; ++j) {
					res.m_arr[i][j] += (m_arr[i][k] * m.m_arr[k][j]) % MODULO;
					res.m_arr[i][j] %= MODULO;
				}
			}
		}

		return std::move(res);
	}

	const static int MODULO = 666013;

	void initIdentity() {
		m_arr[0][0] = m_arr[1][1] = m_arr[2][2] = 1;
		m_arr[0][1] = m_arr[0][2] = m_arr[1][0] = m_arr[1][2] = m_arr[2][0] = m_arr[2][1] = 0;
	}

	int getResult(int& x, int& y, int& z) {
		return ((m_arr[0][0] * z) % MODULO + (m_arr[0][1] * y) % MODULO + (m_arr[0][2] * x) % MODULO) % MODULO;
	}

private:
	std::array<std::array<int, 3>, 3> m_arr;
};

Matrix compute(Matrix& m, int&& n) {
	Matrix sol;
	sol.initIdentity();
	
	for (int i = 0; (1 << i) <= n; ++i) {
		if ((1 << i) & n) {
			sol = sol * m;
		}

		m = m * m;
	}

	return std::move(sol);
}

int main() {
	std::ifstream in("iepuri.in");
	std::ofstream out("iepuri.out");

	Matrix m, res;
	int t, x, y, z, a, b, c, n;

	in >> t;
	while (t--) {
		in >> x >> y >> z >> a >> b >> c >> n;
		m.initMatrix(a, b, c);
		res = compute(m, n - 2);
		out << res.getResult(x, y, z) << std::endl;
	}

	out.close();

	return 0;
}