Cod sursa(job #477360)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 14 august 2010 11:49:11
Problema Iepuri Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<fstream>
#include<iostream>
#include<string.h>
using namespace std;

const int MODULO=666013;
void CreateMat(long long **&mat, int n, int m)
{
	int i;
	mat=new long long*[n];
	for(i=0; i<n; ++i)
	{
		mat[i]=new long long[m];
	}
}

void InitMat(long long **&mat, int n, int m)
{
	for(int i=0; i<n; ++i)
	{
		memset(mat[i],0,m*sizeof(long long));
	}
}

void MulMat(long long** const a, long long** const b, long long **r)
{
	int i,j,k;
	for(i=0; i<3; ++i)
	{
		memset(r[i],0,3*sizeof(long long));
		for(j=0; j<3; ++j)
		{
			for(k=0; k<3; k++)
			{
				r[i][j]=r[i][j]+((a[i][k]*b[k][j]))%MODULO;
			}
		}
	}
}

void PrintMat(long long** const a)
{
	int i,j;
	for(i=0; i<3; ++i)
	{
		for(j=0; j<3; ++j)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
}

int main()
{
	long long **a,**c,**aux,**sol,**swap,i,j;
	int X,Y,Z,A,B,C,N,T;
	CreateMat(a,3,3);
	CreateMat(c,3,3);
	CreateMat(aux,3,3);
	CreateMat(sol,3,3);

	fstream fin("iepuri.in",fstream::in);
	fstream fout("iepuri.out",fstream::out);
	fin>>T;
	for(i=0; i<T; ++i)
	{
		fin>>X>>Y>>Z>>A>>B>>C>>N;
		//cout<<X<<Y<<Z<<A<<B<<C<<N<<endl;
		N-=2;
		InitMat(a,3,3);
		a[1][0]=a[2][1]=1;
		a[0][0]=A;
		a[0][1]=B;
		a[0][2]=C;
		InitMat(sol,3,3);
		sol[0][0]=sol[1][1]=sol[2][2]=1;
		for(j=0; (1<<j)<=N; ++j)
		{
			if( (1<<j) & N )
			{
				MulMat(sol,a,aux);
				swap=aux;
				aux=sol;
				sol=swap;
			}
			MulMat(a,a,c);
			swap=c;
			c=a;
			a=swap;
		}
		fout<<(sol[0][0]*Z+sol[0][1]*Y+sol[0][2]*X)%MODULO<<endl;
	}
	fin.close();
	fout.close();
	return 0;
}