Cod sursa(job #1651820)

Utilizator ArkinyStoica Alex Arkiny Data 13 martie 2016 22:15:51
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<algorithm>
#include<map>
using namespace std;

ifstream in("iepuri.in");
ofstream out("iepuri.out");

#define MOD 666013

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

class Matrix3
{
public:
	int A[4][4];

	Matrix3(int x1, int x2, int x3, int y1, int y2, int y3, int z1, int z2, int z3)
	{
		A[1][1] = x1, A[1][2] = x2, A[1][3] = x3;

		A[2][1] = y1, A[2][2] = y2, A[2][3] = y3;

		A[3][1] = z1, A[3][2] = z2, A[3][3] = z3;
	}
	Matrix3(const Matrix3 &m)
	{
		A[1][1] = m.A[1][1], A[1][2] = m.A[1][2], A[1][3] = m.A[1][3];
		A[2][1] = m.A[2][1], A[2][2] = m.A[2][2], A[2][3] = m.A[2][3];
		A[3][1] = m.A[3][1], A[3][2] = m.A[3][2], A[3][3] = m.A[3][3];
	}
	Matrix3 operator *(Matrix3 &m)
	{
		Matrix3 m_ret(0,0,0,0,0,0,0,0,0);
		
		int i, j, k;
		for (k = 1;k <= 3;++k)
			for (i = 1;i <= 3;++i)
			{
				for (j = 1;j <= 3;++j)
					m_ret.A[k][i] += (A[k][j] * m.A[j][i])%MOD;
				m_ret.A[k][i] = m_ret.A[k][i] % MOD;
			}
	    return m_ret;

	}

};

Matrix3 pow(Matrix3 m, int p)
{
	Matrix3 pr(1, 0, 0, 0, 1, 0, 0, 0, 1);
	while (p != 1)
	{
		if ((p & 1) == 1)
		{
			pr = pr*m;
			--p;
		}
		else
		{
			m = m*m;
			p = p / 2;
		}
	}

	return m*pr;
}

int main()
{
	in >> T;
	while (T--)
	{
		in >> X >> Y >> Z >> A >> B >> C >> N;

		Matrix3 m(0, 0, C, 1, 0, B,0, 1, A);

		m = pow(m, N - 2);

		out << ((X*m.A[1][3])%MOD + (Y*m.A[2][3])%MOD + (Z*m.A[3][3])%MOD)%MOD<<'\n';

	}

	return 0;
}