Cod sursa(job #404413)

Utilizator diannaDiaconu Diana dianna Data 26 februarie 2010 09:20:05
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<fstream>
using namespace std;
ifstream f("iepuri.in");
ofstream g("iepuri.out");
#define m 666013
int t,X,Y,Z,A,B,C;
int N,vec[3],a[3][3],c[3][3],sol[3][3],sol1[3][3];

void citire()
{
	f>>X>>Y>>Z>>A>>B>>C>>N;
	vec[2]=X;
	vec[1]=Y;
	vec[0]=Z;
}

void init()
{
	a[0][0]=A;
	a[0][1]=B;
	a[0][2]=C;
	a[1][0]=1;
	a[1][1]=0;
	a[1][2]=0;
	a[2][0]=0;
	a[2][1]=1;
	a[2][2]=0;
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			if(i==j)
				sol[i][j]=1;
			else
				sol[i][j]=0;
}
	
void inmultire(int a[][3],int b[][3], int d[][3])
{
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		{
			d[i][j]=0;
			for(int k=0;k<3;k++)
				d[i][j]=(d[i][j]+(a[i][k]*b[k][j])%m)%m;
		}
}

void atrib(int c[][3], int sol[][3])
{
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
			c[i][j]=sol[i][j];
}

int main()
{
	f>>t;
	for(int i=0;i<t;i++)
	{
		citire();
		init();
		for(int j=4;j>=0;j--)
		{
			atrib(c,sol);
			inmultire(c,c,sol);
			if((1<<j&(N-2))!=0)
			{	inmultire(sol,a,sol1);
				atrib(sol,sol1);
			}
		}
		g<<sol[0][0]*Z+sol[0][1]*Y+sol[0][2]*X<<'\n';
	}	
	g.close();
	return 0;
}