Cod sursa(job #1607562)

Utilizator krityxAdrian Buzea krityx Data 21 februarie 2016 13:29:04
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <vector>
#define MOD 666013

using namespace std;


int mulMod(int a, int b, int mod)
{
	return ((a % mod) * (b % mod) % mod);
}


vector<vector<int>> idvector(int dim)
{
	vector<vector<int>> result;
	result.resize(dim);
	for (int i = 0; i < dim; i++)
	{
		result[i].resize(dim);
		result[i][i] = 1;
	}
	return result;
}

vector<vector<int>> matrixProduct(vector<vector<int>> m1, vector<vector<int>> m2)
{
	vector<vector<int>> result;
	result.resize(m1.size());
	for (vector<vector<int>>::iterator it = result.begin(); it != result.end(); it++)
	{
		it->resize(m2.size());
	}
	for (size_t i = 0; i < m1.size(); i++)
	{
		for (size_t j = 0; j < m2[0].size(); j++)
		{
			int sum = 0;
			for (size_t k = 0; k < m2.size(); k++)
			{
				//sum += ((m1[i][k] % MOD) * (m2[k][j] % MOD)) % MOD;
				sum += mulMod(m1[i][k], m2[k][j], MOD);
			}
			result[i][j] = sum;
		}
	}
	return result;
}

vector<vector<int>> matrixPow(vector<vector<int>> m, int p)
{
	if (p == 0)
	{
		return idvector(m.size());
	}
	if (p == 1)
	{
		return m;
	}
	if (p % 2 == 0)
	{
		return matrixPow(matrixProduct(m, m), p / 2);
	}
	else
	{
		return matrixProduct(m, matrixPow(matrixProduct(m, m), (p - 1) / 2));
	}
}

int main()
{
	int N, A, B, C, X, Y, Z, T;
	vector<int> V;
	vector<vector<int>> M;
	ifstream f("iepuri.in");
	ofstream g("iepuri.out");
	f >> T;
	for (; T; T--)
	{
		f >> X >> Y >> Z >> A >> B >> C >> N;

		V.resize(3);
		M.resize(3); M[0].resize(3); M[1].resize(3); M[2].resize(3);

		V[0] = X; V[1] = Y; V[2] = Z;
		M[0][0] = 0; M[0][1] = 0; M[0][2] = C;
		M[1][0] = 1; M[1][1] = 0; M[1][2] = B;
		M[2][0] = 0; M[2][1] = 1; M[2][2] = A;

		vector<vector<int>> result = matrixPow(M, N - 2);

		int ans = (mulMod(V[0], result[0][2], MOD) + mulMod(V[1], result[1][2], MOD) + mulMod(V[2], result[2][2], MOD)) % MOD;
		g << ans << "\n";
	}
	f.close();
	g.close();
	return 0;
}