Cod sursa(job #365586)

Utilizator bigdoggMic Matei bigdogg Data 19 noiembrie 2009 13:36:59
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream.h>

#define	RRR 666013

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

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


int main()
{
	long long i,n,t,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)%RRR+(ABCN[1][2]*y)%RRR+(ABCN[1][3]*z)%RRR;
		if(x>=RRR) x%=RRR;
		out<<x<<'\n';
	}
	in.close(); out.close();
	
	return 0;
}

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

void pow(long long 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])
{
	long long i,j,C[4][4];
	
	for(i=1;i<=3;++i)
		for(j=1;j<=3;++j)
		{
			C[i][j]=(A[i][1]*B[1][j])%RRR+(A[i][2]*B[2][j])%RRR+(A[i][3]*B[3][j])%RRR;
			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];
}