Cod sursa(job #2465157)

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


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

	void initMatrix(long long & a, long long & b, long long & 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 (long long  k = 0; k < 3; ++k) {
			for (long long  i = 0; i < 3; ++i) {
				for (long long  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 long long  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;
	}

	long long  getResult(long long & x, long long & y, long long & 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<long long , 3>, 3> m_arr;
};

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

		m = m * m;
	}

	return sol;
}

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

	Matrix m, res;
	long long  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;
}