Cod sursa(job #531858)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 10 februarie 2011 14:01:39
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#define Mod 666013
#define ll long long

ll a[5][5] , s[5][5], c[5][5] ;
int A,B,C,n,T,sol,x,y,z;


void init( ll a[5][5] ) 
{
	a[1][1] = a[1][3] = a[2][1] = a[2][2] = 0 ;
	a[1][2] = a[2][3] = 1 ;
	a[3][1] = C ; a[3][2] = B ; a[3][3] = A ;
}

void unitate( ll s[5][5] ) 
{
	s[1][1] = s[2][2] = s[3][3] = 1 ;
	s[1][2] = s[1][3] = s[2][1] = s[2][3] = s[3][1] = s[3][2] = 0 ;
}

void mnula( ll a[5][5] ) 
{
	a[1][1] = a[1][2] = a[1][3] = a[2][1] = a[2][2] = a[2][3] = a[3][1] = a[3][2] = a[3][3] = 0 ;
}

void copiaza ( ll a[5][5], ll b[5][5] ) 
{
	int i, j ; 
	
	for( i = 1 ; i <= 3 ; i++ )
		for( j = 1 ; j <= 3 ; j++ )
			a[i][j] = b[i][j] ;
}

void inmulteste ( ll a[5][5], ll b[5][5] ) 
{
	int i,j,k ;
	
	mnula(c);
	
	for( i = 1 ; i <= 3 ; i++ )
		for( j = 1 ; j <= 3 ; j++ )
			for( k = 1 ; k <= 3 ; k++ )
			{
				c[i][j] = c[i][j] + ( ( a[i][k] * b[k][j] ) % Mod ) ;
				if( c[i][j] > Mod ) c[i][j] %= Mod ;
			}
}

void lgput( ll a[5][5], int b ) 
{
	for( ; b ; b>>=1 ) 
	{
		if( b & 1 ) 
		{
			inmulteste(s,a);
			copiaza(s,c);
		}
		inmulteste(a,a);
		copiaza(a,c);
	}
}

int main()
{
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	
	scanf("%d",&T);
	
	for( ; T ; --T )
	{
		scanf("%d %d %d %d %d %d %d",&x,&y,&z,&A,&B,&C,&n) ;
		
		init(a);
		unitate(s);
		
		lgput(a,n-2);
		
		sol = ( ( (s[3][3] * z) % Mod ) + ( ( s[3][2] * y ) % Mod ) + ( ( s[3][1] * x ) % Mod ) ) % Mod ; 
		
		printf("%d\n",sol);
	}
	
	return 0;
}