Cod sursa(job #3124093)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 26 aprilie 2023 21:17:45
Problema Iepuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int MOD = 666013; 
int T, X, Y, Z, A, B, C, N; 

int M_rez[4][4], M_static[4][4];

void citire() {
	fin >> X >> Y >> Z >> A >> B >> C >> N; 
}

void copiere(int a[4][4], int b[4][4]) {
	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			a[i][j] = b[i][j];
}

void init() {
	M_rez[1][1] = 1; 
	M_rez[1][2] = 0; 
	M_rez[1][3] = 0; 
	M_rez[2][1] = 0; 
	M_rez[2][2] = 1; 
	M_rez[2][3] = 0; 
	M_rez[3][1] = 0; 
	M_rez[3][2] = 0; 
	M_rez[3][3] = 1; 

	M_static[1][1] = A; 
	M_static[1][2] = B; 
	M_static[1][3] = C; 
	M_static[2][1] = 1;
	M_static[2][2] = 0;
	M_static[2][3] = 0;
	M_static[3][1] = 0;
	M_static[3][2] = 1;
	M_static[3][3] = 0;
}

void inmultire_matrici(int a[4][4], int b[4][4]) {
	int c[4][4];
	for (int i = 1; i <= 3; i++) {
		for (int j = 1; j <= 3; j++) {
			c[i][j] = 0;
			for (int k = 1; k <= 3; k++) {
				c[i][j] += (1LL * a[i][k] * b[k][j]) % MOD;
				c[i][j] = c[i][j] % MOD;
			}
		}
	}

	for (int i = 1; i <= 3; i++)
		for (int j = 1; j <= 3; j++)
			a[i][j] = c[i][j];
}


/* 

vector <int> binary(int num) {
	vector <int> v;
	int r;
	while (num) {
		r = num % 2;
		num /= 2;
		v.push_back(r);
	};

	reverse(v.begin(), v.end());
	return v;
}

void iepuri(vector <int> v) {
	if (v[0] == 0) {
		v.pop_back();
		copiere(M_rez, M_static);
	}

	for (int i = 0; i < v.size(); i++) {
		if (v[i] == 1) {
			inmultire_matrici(M_rez, M_rez);
			inmultire_matrici(M_rez, M_static);
		}
		else {
			inmultire_matrici(M_rez, M_rez);
		}
	}

	cout << "Afisare numar: ";
	cout << Z * M_rez[1][1] + Y * M_rez[1][2] + X * M_rez[1][3] << '\n';
}

void afisare_rez() {
	cout << '\n';
	for (int i = 1; i <= 3; i++, cout << '\n')
		for (int j = 1; j <= 3; j++)
			cout << M_rez[i][j] << " ";
	cout << '\n';
}
*/

void iepuriBitWise() {
	N = N - 2; 
	while (N) {
		if (N & 1) {
			inmultire_matrici(M_rez, M_static); 
			N--; 
		}
		inmultire_matrici(M_static, M_static); 
		N >>= 1; 
	}

	fout << Z * M_rez[1][1] + Y * M_rez[1][2] + X * M_rez[1][3] << '\n';
}

int main() {
	fin >> T; 
	for (int i = 1; i <= T; i++) {
		citire();
		init();
		iepuriBitWise();
	}

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