Cod sursa(job #405427)

Utilizator marius135Dumitran Adrian Marius marius135 Data 28 februarie 2010 00:00:40
Problema Iepuri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<string.h>

#define modulo 666013

void inmult( int a[3][3], int b[3][3])
{
	int c[3][3];memset(c,0,sizeof(c));
	
	for( int i = 0; i <= 2; ++i)
		for( int j = 0; j < 3; ++j)
			for( int k = 0; k < 3; ++k)
			{
				c[i][j] = (c[i][j] + (long long)a[i][k] * b[k][j])% modulo;
			}
			
	for( int i  = 0; i < 3; ++i)
		for( int j = 0; j <= 2; ++j)
			a[i][j] = c[i][j];
}

int main()
{
	int T;
	
	freopen("iepuri.in","r",stdin);
	freopen("iepuri.out","w",stdout);
	
	scanf("%d", &T);
	
	while( T-- )
	{
		int X,Y,Z,A,B,C,N,M[3][3], rez[3][3];
		scanf("%d %d %d %d %d %d %d",&X,&Y,&Z,&A,&B,&C,&N);
		M[0][0] = M[0][2] = M[1][0] = M[1][1] = 0;
		M[0][1] = M[1][2] = 1; 	M[2][0] = C; M[2][1] = B; M[2][2] = A;
		rez[0][0] = rez[1][1] = rez[2][2] = 1;
		rez[0][1] = rez[0][2] = rez[1][0] = rez[1][2] = rez[2][0] = rez[2][1] = 0;
		
		unsigned int p = 1;
		while( N )
		{
			if( N & p)
			{ 
				inmult(rez,M); 
				N^=p;
			}
			inmult(M,M);
			p <<= 1;
		}
		int aux[3][3];
		aux[0][1] = aux[0][2] = aux[1][1] = aux[1][2] = aux[2][1] = aux[2][2] = 0; aux[0][0] = X; aux[1][0] = Y; aux[2][0] = Z;
		
		inmult( rez, aux);
		printf("%d\n", rez[0][0]);
	}
	
	
	return 0;
}