Cod sursa(job #762092)

Utilizator cosminx2003Cosmin Clapon cosminx2003 Data 28 iunie 2012 17:24:50
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <iostream>
#include <fstream>
#define NMAX 666013
#define ll long long

using namespace std;

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

ll M[3][3], P[3][3], aux[3][3];

void mult(ll A[3][3], ll B[3][3]) {
	ll i,j,k,sum;

	for(i = 0; i < 3; i++)
		for(j = 0; j < 3; j++) {
			sum = 0;
			for(k = 0; k < 3; k++)
				sum += (ll)(A[i][k]*B[k][j])%NMAX;
			aux[i][j] = (ll)sum%NMAX;
		}

	for(i = 0; i < 3; i++)
		for(j = 0; j < 3; j++)
			A[i][j] = aux[i][j];
}

int exp(ll A, ll B, ll C, ll n) {
	n -= 2;
	M[0][0] = A, M[0][1] = B, M[0][2] = C;
	M[1][0] = 1, M[1][1] = 0, M[1][2] = 0;
	M[2][0] = 0, M[2][1] = 1, M[2][2] = 0;

	P[0][0] = 1, P[0][1] = 0, P[0][2] = 0;
	P[1][0] = 0, P[1][1] = 1, P[1][2] = 0;
	P[2][0] = 0, P[2][1] = 0, P[2][2] = 1;

	while(n) {
		if(n&1)
			mult(P,M);
		mult(M,M);
		n >>= 1;
	}
}


int main() {
	ll X,Y,Z,A,B,C,n,T,i;

	f>>T;
	for(i = 0; i < T; i++) {
		f>>X>>Y>>Z>>A>>B>>C>>n;
		exp(A,B,C,n);
		g<<((ll)P[0][0]*Z%NMAX+(ll)P[0][1]*Y%NMAX+P[0][2]*(ll)X%NMAX)%NMAX<<"\n";
	}

	return 0;
}