Cod sursa(job #1727964)

Utilizator vladc096Vlad Cincean vladc096 Data 11 iulie 2016 23:01:14
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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;
				c[i][j] += ((a[i][k] % 666013) * (b[k][j] % 666013)) % 666013;
			}
			c[i][j] %= 666013;
		}
	}
	a = c;
}

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);
		int sol = 0;
		sol = (sol + (M[2][0] * X)) % 666013;
		sol = (sol + (M[2][1] * Y)) % 666013;
		sol = (sol + (M[2][2] * Z)) % 666013;
		g << sol << "\n";
	}
	f.close();
	g.close();

	return 0;
}