Cod sursa(job #1727962)

Utilizator vladc096Vlad Cincean vladc096 Data 11 iulie 2016 22:53:43
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>

using namespace std;

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

void multiplyMatrices(vector<vector<int>>& a, vector<vector<int>> b) {
	vector<vector<int>> c{ {0,0,0},{0,0,0},{0,0,0} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				c[i][j] += ((a[i][k] * b[k][j]) % 666013);
			}
			c[i][j] %= 666013;
		}
	}
	a = c;
}

// | 0 1 0 |   | X |   |      Y       |
// | 0 0 1 | * | Y | = |      Z       |
// | C B A |   | Z |   | CX + BY + AZ |
// it returns M ^ p
vector<vector<int>> characteristicMatrix(long long p) {
	vector<vector<int>> M{ {0,1,0},{0,0,1},{C,B,A} }; // M
	vector<vector<int>> r{ {1,0,0},{0,1,0},{0,0,1} }; // I3
	while (p > 0) {
		if (p % 2 == 1) {
			multiplyMatrices(r, M);
			--p;
		}
		multiplyMatrices(M, M);
		p /= 2;
	}
	return r;
}

int main() {
	int T;
	long long N;
	ifstream f("iepuri.in");
	f >> T;
	ofstream g("iepuri.out");
	for (int i = 0; i < T; i++) {
		f >> X >> Y >> Z >> A >> B >> C >> N;
		vector<vector<int>> M = characteristicMatrix(N - 2);
		g << ((M[2][0] * X + M[2][1] * Y + M[2][2] * Z) % 666013) << "\n";
	}
	f.close();
	g.close();

	return 0;
}