Cod sursa(job #794526)

Utilizator matei_cChristescu Matei matei_c Data 6 octombrie 2012 14:42:32
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>

#define MOD 666013
#define maxm 4

long long A[maxm][maxm],B[maxm][maxm],C[maxm][maxm] ;
int x,y,z,a,b,c ;
long long n ;
int t ;

void init_mat()
{

	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j)
			A[i][j] = B[i][j] = C[i][j] = 0 ;
			
	A[1][1] = z ; A[2][1] = y ; A[3][1] = x ;
	B[1][1] = a ; B[1][2] = b ; B[1][3] = c ;
	B[2][1] = B[3][2] = 1 ;
	
}

void calc(long long n)
{
	
	init_mat () ;
	
	n -= 2 ;
	
	while(n)
	{
		if( n % 2 )
		{
			for(int i=1;i<=3;++i)
				for(int j=1;j<=3;++j)
					for(int k=1;k<=3;++k)
						C[i][j] = ( C[i][j] + A[k][j] * B[i][k] ) % MOD ;
						
			for(int i=1;i<=3;++i)
			{	
				for(int j=1;j<=3;++j)
				{	
					A[i][j] = C[i][j] ;
					C[i][j] = 0 ;
				}
			}	
		}
			
		for(int i=1;i<=3;++i)
			for(int j=1;j<=3;++j)
				for(int k=1;k<=3;++k)
					C[i][j] = ( C[i][j] + B[i][k] * B[k][j] ) % MOD ;
					
		for(int i=1;i<=3;++i)
		{	
			for(int j=1;j<=3;++j)
			{	
				B[i][j] = C[i][j] ;
				C[i][j] = 0 ;
			}
		}
		
		n /= 2 ;
		
	}
		
}

int main()
{

	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	
	scanf("%d",&t);
	
	++t ;
	while( --t )
	{
		
		scanf("%d%d%d%d%d%d%lld",&x,&y,&z,&a,&b,&c,&n);
		
		calc ( n ) ;
		
		printf("%lld\n",A[1][1]);
		
	}	
	
	return 0 ;
	
}