Cod sursa(job #3041372)

Utilizator AlexMihai1801Mihai Alexandru AlexMihai1801 Data 31 martie 2023 13:25:18
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <bits/stdc++.h>
using namespace std;

// constanta modulo folosita in aceasta problema
#define MOD 666013

vector<vector<int>> identity_matrix() {
	vector<vector<int>> matrix(3, vector<int>(3, 0));
	matrix[0][0] = 1;
	matrix[1][1] = 1;
	matrix[2][2] = 1;
	return matrix;
}

vector<vector<int>> mult_matrix(vector<vector<int>> A, vector<vector<int>> B) {
	vector<vector<int>> matrix(3, vector<int>(3, 0));
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++) {
				matrix[i][j] = (matrix[i][j] + (A[i][k] * B[k][j]) % MOD) % MOD;
			}
		}
	}
	return matrix;
}

vector<vector<int>> exponentiate_matrix(vector<vector<int>> matrix, int exponent) {
	vector<vector<int>> highest_power = matrix;
	vector<vector<int>> result = identity_matrix();

		while (exponent) {
			if (exponent % 2 == 1) {
				result = mult_matrix(result, highest_power);
			}
			exponent /= 2;
			highest_power = mult_matrix(highest_power, highest_power);
		}

		return result;
}

vector<vector<int>> build_matrix(int A, int B, int C) {
	vector<vector<int>> matrix(3, vector<int>(3, 0));
	matrix[0][2] = C;
	matrix[1][0] = 1;
	matrix[1][2] = B;
	matrix[2][1] = 1;
	matrix[2][2] = A;
	return matrix;
}

int main() {
	int T;
	int X, Y, Z, A, B, C, N;
	int result;

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

	fin >> T;

	for (int i = 0; i < T; i++) {
		fin >> X >> Y >> Z >> A >> B >> C >> N;
		vector<vector<int>> matrix = build_matrix(A, B, C);
		vector<vector<int>> exp_matrix = exponentiate_matrix(matrix, N - 2);
		result = ((X * exp_matrix[0][2]) % MOD + (Y * exp_matrix[1][2]) % MOD + (Z * exp_matrix[2][2]) % MOD) % MOD;
		fout << result << "\n";
	}

	fin.close();
	fout.close();
    return 0;
}