Cod sursa(job #460819)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 4 iunie 2010 09:26:12
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstring>

#define file_in "iepuri.in"
#define file_out "iepuri.out"

#define mod 666013

long long T,n;
long long x,y,z,A,B,C;


void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%lld", &T);
}

void mul(long long a[3][3],long long b[3][3])
{
	long long i,j,k;
	long long c[3][3];
	
	memset(c,0,sizeof(c));
	
	for (i=0;i<3;++i)
		 for (j=0;j<3;++j)
			  for (k=0;k<3;++k)
				   c[i][j]=((long long)c[i][j]+(long long)a[i][k]*b[k][j]%mod)%mod;
	memcpy(a,c,sizeof(c));
}


void solve()
{
	long long sol,i,j;
	
	while(T--)
	{
		scanf("%lld %lld %lld %lld %lld %lld %lld", &x, &y, &z, &A, &B, &C, &n);
		
		long long a[3][3]={ {0,0,C}, {1,0,B}, {0,1,A} }; 
		long long b[3][3]={ {1,0,0}, {0,1,0}, {0,0,1} }; 
	
		n-=2;
		while(n)
		{
			if (n&1)
				mul(b,a);
			mul(a,a);
			n>>=1;
		}
		x%=mod;
		y%=mod;
		z%=mod;
		sol=0;
		
		/*for (i=0;i<3;++i)
		{
			for (j=0;j<3;++j)
				 printf("%d ", b[i][j]);
			printf("\n");
		}*/
		
		
		sol=((x*b[0][2])%mod+(y*b[1][2])%mod+(z*b[2][2])%mod)%mod;
		printf("%lld\n", sol);
	}
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}