Cod sursa(job #404431)

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

void citire()
{
	f>>X>>Y>>Z>>A>>B>>C>>N;
}

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(long long  i=0;i<3;i++)
		for(long long  j=0;j<3;j++)
			if(i==j)
				sol[i][j]=1;
			else
				sol[i][j]=0;
}
	
void inmultire(long long  q[][3],long long  b[][3], long long  d[][3])
{
	for(long long  i=0;i<3;i++)
		for(long long  j=0;j<3;j++)
		{
			d[i][j]=0;
			for(long long  k=0;k<3;k++)
				d[i][j]=(d[i][j]+(q[i][k]*b[k][j])%m)%m;
		}
}

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

int main()
{
	f>>t;
	for(long long  i=0;i<t;i++)
	{
		citire();
		init();
		for(long long  j=31;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)%m+(sol[0][1]*Y)%m+(sol[0][2]*X)%m)%m<<'\n';
	}	
	g.close();
	return 0;
}