Cod sursa(job #1338394)

Utilizator IulianBoboUAIC Boboc Iulian IulianBobo Data 9 februarie 2015 23:31:25
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
using namespace std;

#define MOD  666013

long long sol[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } };

long long A[3][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 0, 1, 0 } };

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

ifstream f("iepuri.in");
ofstream g("iepuri.out");

void multiply(long long sol[][3], long long A[][3])
{
	int i, j,k;

	long long temp;
	long long B[3][3];

	for (i = 0; i < 3; ++i)
	{
		for (j = 0; j < 3; ++j)
		{
			B[i][j] = sol[i][j];
		}
	}

	for (i = 0; i < 3; ++i)
	{
		for (j = 0; j < 3; ++j)
		{
			temp = 0;
			for (k = 0; k < 3; ++k)
			{
				temp = temp + sol[i][k] * A[k][j] % MOD;
			}
			B[i][j] = temp % MOD;
		}
	}

	for (i = 0; i < 3; ++i)
	{
		for (j = 0; j < 3; ++j)
		{
			sol[i][j] = B[i][j];
		}
	}
}

void compute()
{
	int p = n - 2;

	long long rez;

	while (p > 1)
	{
		if (p % 2 == 0)
		{
			multiply(A, A);
			p /= 2;
		}
		else
		{
			multiply(sol, A);
			multiply(A, A);
			p = (p - 1) / 2;
		}
	}

	multiply(sol, A);
	rez = (sol[0][0] * z) % MOD + (sol[0][1] * y) % MOD + (sol[0][2] * x) % MOD;

	g << rez % MOD << "\n";

}

int main()
{
	f >> t;
	for (int i = 1; i <= t; ++i)
	{
		f >> x >> y >> z >> a >> b >> c >> n;

		A[0][0] = a; A[1][0] = 1; A[2][0] = 0;
		A[0][1] = b; A[1][1] = 0; A[2][1] = 1;
		A[0][2] = c; A[1][2] = 0; A[2][2] = 0;

		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; ++k)
			{
				sol[j][k] = (j == k) ? 1 : 0;
			}
		}

		compute();
	}
	f.close();
	g.close();
	return 0;
}