Cod sursa(job #365589)

Utilizator bigdoggMic Matei bigdogg Data 19 noiembrie 2009 13:42:02
Problema Iepuri Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <fstream.h>

#define	RRR 666013

long long ABC[4][4],ABCN[4][4];

void init();
void pow(int n);
void AxB(long long A[4][4],long long B[4][4]);


int main()
{
	short i,n,t;
	long long x,y,z;
	
	ifstream in("iepuri.in");
	ofstream out("iepuri.out");
	in>>t;
	for(i=1;i<=t;++i)
	{
		init();
		in>>x>>y>>z;
		in>>ABC[3][3]>>ABC[3][2]>>ABC[3][1]; ABC[1][2]=ABC[2][3]=1;
		in>>n; pow(n);
		x=ABCN[1][1]*x+ABCN[1][2]*y+ABCN[1][3]*z;
		if(x>=RRR) x%=RRR;
		out<<x<<'\n';
	}
	in.close(); out.close();
	
	return 0;
}

void init()
{
	short i,j;
	
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j) ABCN[i][j]=ABC[i][j]=0;
}

void pow(int n)
{
	ABCN[1][1]=ABCN[2][2]=ABCN[3][3]=1;
	
	while(n>0)
	{
		if(n&1==1){ AxB(ABCN,ABC); --n; }
		AxB(ABC,ABC);
		n>>=1;
	}
}

void AxB(long long A[4][4],long long B[4][4])
{
	short i,j;
	long long C[4][4];
	
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j)
		{
			C[i][j]=A[i][1]*B[1][j]+A[i][2]*B[2][j]+A[i][3]*B[3][j];
			if(C[i][j]>=RRR) C[i][j]%=RRR;
		}
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j) A[i][j]=C[i][j];
}