Cod sursa(job #1737004)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 3 august 2016 00:49:09
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>

using namespace std;

long long mat[3][3];
long long sol[3][3];

void mult (long long a[][3], long long b[][3], long long c[][3])
{
	for (int i = 0; i <= 2; i++)
	{
		for (int j = 0; j <= 2; j++)
		{
			for (int k = 0; k <= 2; k++)
			{
				c[i][j] = (c[i][j] + a[i][k] * b[k][j] * 1LL) % 666013;
			}
		}
	}
}

void lg_power (int p)
{
	long long aux[3][3];
	memset(sol, 0, sizeof(sol));
	sol[0][0] = 1;
	sol[1][1] = 1;
	sol[2][2] = 1;//matr unitate
	for (int i = 0; (1<<i) <= p; i++)
	{
		if ((1<<i) & p)
		{
			memset(aux, 0, sizeof(aux));
			mult (mat, sol, aux);
			memcpy (sol, aux, sizeof(aux));
		}

		memset (aux, 0, sizeof(aux));
		mult (mat, mat, aux);
		memcpy (mat, aux, sizeof(aux));

	}
}

int main()
{

	freopen ("iepuri.in", "r", stdin);
	freopen ("iepuri.out", "w", stdout);
	int x,y,z,a,b,c,n;
	int t;
	cin>>t;
	for (int i = 1; i <= t;i++)
	{
		//cin>>x>>y>>z>>a>>b>>c>>n;
		scanf("%d%d%d%d%d%d%d", &x, &y, &z, &a, &b, &c, &n);
		mat[0][0] = a;
		mat[1][0] = b;
		mat[2][0] = c;
		mat[0][1] = 1;
		mat[1][1] = 0;
		mat[2][1] = 0;
		mat[0][2] = 0;
		mat[1][2] = 1;
		mat[2][2] = 0;
//cout<<"n: "<<n<<endl;
		lg_power(n-2);

		long long aux = (((long long)sol[0][0] * (long long)z)%666013 + ((long long)sol[1][0] * (long long)y)%666013
		+ ((long long) sol[2][0] * (long long)x)%666013);
		aux = aux % 666013;
		//cout<<aux<<"\n";
		printf("%llu\n", aux);
	}
}