Cod sursa(job #2019384)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 7 septembrie 2017 17:17:07
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <cstdio>

using namespace std;

class Matrice{
public: 
	long long mat[3][3];

	Matrice(){
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 3; j++)
			{
				mat[i][j] = 0;
			}
		}
	}

	void setValues(long long _mat[3][3])
	{
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 3; j++)
			{
				mat[i][j] = _mat[i][j];
			}
		}
	}

	void print(){
		for(int i = 0; i < 3; i++)
		{
			for(int j = 0; j < 3; j++)
			{
				printf("%lld ", mat[i][j]);
			}
			printf("\n");
		}
	}

	Matrice operator*(const Matrice& m)
	{
		Matrice mx;
		mx.mat[0][0] = this->mat[0][0] * m.mat[0][0] % 666013 + this->mat[0][1] * m.mat[1][0] % 666013 + this->mat[0][2] * m.mat[2][0] % 666013 ;
		mx.mat[0][1] = this->mat[0][0] * m.mat[0][1] % 666013 + this->mat[0][1] * m.mat[1][1] % 666013 + this->mat[0][2] * m.mat[2][1] % 666013 ;
		mx.mat[0][2] = this->mat[0][0] * m.mat[0][2] % 666013 + this->mat[0][1] * m.mat[1][2] % 666013 + this->mat[0][2] * m.mat[2][2] % 666013 ;
		mx.mat[1][0] = this->mat[1][0] * m.mat[0][0] % 666013 + this->mat[1][1] * m.mat[1][0] % 666013 + this->mat[1][2] * m.mat[2][0] % 666013 ;
		mx.mat[1][1] = this->mat[1][0] * m.mat[0][1] % 666013 + this->mat[1][1] * m.mat[1][1] % 666013 + this->mat[1][2] * m.mat[2][1] % 666013 ;
		mx.mat[1][2] = this->mat[1][0] * m.mat[0][2] % 666013 + this->mat[1][1] * m.mat[1][2] % 666013 + this->mat[1][2] * m.mat[2][2] % 666013 ;
		mx.mat[2][0] = this->mat[2][0] * m.mat[0][0] % 666013 + this->mat[2][1] * m.mat[1][0] % 666013 + this->mat[2][2] * m.mat[2][0] % 666013 ;
		mx.mat[2][1] = this->mat[2][0] * m.mat[0][1] % 666013 + this->mat[2][1] * m.mat[1][1] % 666013 + this->mat[2][2] * m.mat[2][1] % 666013 ;
		mx.mat[2][2] = this->mat[2][0] * m.mat[0][2] % 666013 + this->mat[2][1] * m.mat[1][2] % 666013 + this->mat[2][2] * m.mat[2][2] % 666013 ;

		return mx;
	}
};

long long t;
long long n, a, b, c, x, y, z;

void citire()
{
	scanf("%lld %lld %lld %lld %lld %lld %lld", &a, &b, &c, &x, &y, &z, &n);
}

Matrice ridicareLaPutere(Matrice &m, long long putere)
{
	Matrice tmp;
	tmp.mat[0][0] = 1;
	tmp.mat[1][1] = 1;
	tmp.mat[2][2] = 1;

	while(putere > 1)
	{
		if((putere & 1) != 0)
		{
			tmp = tmp * m;
			m = m * m;
			putere /= 2;
		}
		else{
			m = m * m;
			putere /= 2;
		}
	}

	return tmp * m;
}

void solve(){
	Matrice m1;
	m1.mat[0][0] = 0;
	m1.mat[0][1] = 0;
	m1.mat[0][2] = c;
	m1.mat[1][0] = 1;
	m1.mat[1][1] = 0;
	m1.mat[1][2] = b;
	m1.mat[2][0] = 0;
	m1.mat[2][1] = 1;
	m1.mat[2][2] = a;

	m1 = ridicareLaPutere(m1, n - 2);
	
	printf("%lld\n", x * m1.mat[0][2] + y * m1.mat[1][2] + z *  m1.mat[2][2]);
}

int main(){
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);

	scanf("%d", &t);

	for(int k = 0; k < t; k++)
	{
		citire();
		solve();
	}
}