Cod sursa(job #872144)

Utilizator david_raucaRauca Ioan David david_rauca Data 5 februarie 2013 20:31:17
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>
using namespace std;

#define mod 666013

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

long long *putere(long long *a, int p);
long long *inmultire( long long *a, long long *b );

int main()
{
	int x, y, z, a, b, c, n, t;
	long long *m = new long long[9];
	fin >> t;
	for( int i = 1; i <= t; ++i )
	{
		fin >> x >> y >> z >> a >> b >> c >> n;
		m[1] = m[3] = m[4] = m[5] = 0;
		m[2] = m[6] = 1;
		m[7] = c;
		m[8] = b;
		m[9] = a;
		m = putere(m, n-2);
		
		fout << ((m[7]*x)%mod + (m[8]*y)%mod + (m[9]*z)%mod)%mod << '\n';
	}
	
	fin.close();
	fout.close();
	
	return 0;
}

long long *putere(long long *a, int p)
{
	if( p == 1 )
		return a;
	long long *aux;
	if( p % 2 == 0 )
	{
		aux = putere( inmultire(a, a), p / 2 );
		return aux;
	}
	else
	{
		aux = inmultire( a, putere( inmultire(a, a), p/2) );
		return aux;
	}
}

long long *inmultire( long long *x, long long *y )
{
	long long *z = new long long[9];

	z[1] = ((x[1]*y[1])%mod + (x[2]*y[4])%mod + (x[3]*y[7])%mod)%mod;
	z[2] = ((x[1]*y[2])%mod + (x[2]*y[5])%mod + (x[3]*y[8])%mod)%mod;
	z[3] = ((x[1]*y[3])%mod + (x[2]*y[6])%mod + (x[3]*y[9])%mod)%mod;
	z[4] = ((x[4]*y[1])%mod + (x[5]*y[4])%mod + (x[6]*y[7])%mod)%mod;
	z[5] = ((x[4]*y[2])%mod + (x[5]*y[5])%mod + (x[6]*y[8])%mod)%mod;
	z[6] = ((x[4]*y[3])%mod + (x[5]*y[6])%mod + (x[6]*y[9])%mod)%mod;
	z[7] = ((x[7]*y[1])%mod + (x[8]*y[4])%mod + (x[9]*y[7])%mod)%mod;
	z[8] = ((x[7]*y[2])%mod + (x[8]*y[5])%mod + (x[9]*y[8])%mod)%mod;
	z[9] = ((x[7]*y[3])%mod + (x[8]*y[6])%mod + (x[9]*y[9])%mod)%mod;
	
	return z;
}