Cod sursa(job #469219)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 6 iulie 2010 23:00:32
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#define mod 666013

using namespace std;

const char iname[] = "iepuri.in";
const char oname[] = "iepuri.out";

ifstream fin(iname);
ofstream fout(oname);

long long A[4][4], B[4][4], C[4][4], i, j, k, MAT[4][4], N, T, X, Y, Z;
long long v[20000], x[20000], l, a, b, c;

void mul(long long A[4][4], long long B[4][4], long long C[4][4])
{	
	
	int i, j, k;
	
	for(i = 0; i < 3; i ++)
		for(j = 0; j < 3; j ++)
			for(k = 0; k < 3; k ++)
				C[i][j] = (C[i][j] + (long long)(A[i][k] * B[k][j])) % mod;
}

void lgput(long long int niv)
{
	int exp = niv;
	int k = 0;
	//v[k ++] = exp;
	while(exp > 0)
		if(exp % 2 == 0)
		{
			v[k ++] = exp;
			exp = exp / 2;  
		}
		else
		{
			v[k ++] = exp;
			exp --;
		}
	reverse(v, v + k);
	
	for(i = 1; i < k; i ++)
	{
		if(v[i] % 2 == 0 )
			
			mul(A, A, C);
		else
			mul(A, B, C);
		memcpy(A, C, sizeof(C));
		memset(C, 0, sizeof(C));
	}
			
}
int main()
{	
	int i;
	fin >> T;
	for(i = 1; i <= T; i ++)
	{
		fin >> X >> Y >> Z >> a >> b >> c >> N;
		A[0][0] = 0, A[0][1] = 1, A[0][2] = 0, A[1][1] = 0, A[1][2] = 1;
		A[1][0] = 0, A[2][0] = c, A[2][1] = b, A[2][2] = a;
		B[0][0] = 0, B[0][1] = 1, B[0][2] = 0, B[1][1] = 0, B[1][2] = 1;
		B[1][0] = 0, B[2][0] = c, B[2][1] = b, B[2][2] = a;
		MAT[0][0] = X, MAT[1][0] = Y, MAT[2][0] = Z;
		lgput(N);
		mul(A, MAT, C);
		memset(v, 0, sizeof(v));
		fout << C[0][0] << "\n";
		memset(C, 0, sizeof(C));
	}
	return 0;
}