Cod sursa(job #3041380)

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

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

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

vector<vector<long long>> mult_matrix(vector<vector<long long>> A, vector<vector<long long>> B) {
	vector<vector<long long>> matrix(3, vector<long long>(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<long long>> exponentiate_matrix(vector<vector<long long>> matrix, int exponent) {
	vector<vector<long long>> highest_power = matrix;
	vector<vector<long long>> 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<long long>> build_matrix(int A, int B, int C) {
	vector<vector<long long>> matrix(3, vector<long long>(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;
	long long 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<long long>> matrix = build_matrix(A, B, C);
		vector<vector<long long>> 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;
}