Cod sursa(job #1171047)

Utilizator stefynr8Space Monkey stefynr8 Data 15 aprilie 2014 00:26:43
Problema Iepuri Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int ** mat_mult(int **mat1, int **mat2)
{
	int **mat ;
	int sum =0;

	mat =(int **) malloc(9* sizeof(int));
	for(int i=0; i<3; i++)
		mat[i] = (int *) malloc(3* sizeof(int));

	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++){
			sum = 0;
			for(int k=0; k<3; k++)
				sum += (mat1[i][k] * mat2[k][j]) % 666013;

			mat[i][j] = sum % 666013;
		}

	return mat;
}

int ** mat_pow(int **mat, long n)
{
	int **mat_ret ;
	mat_ret =(int **) malloc(9* sizeof(int));
	for(int i=0; i<3; i++)
		mat_ret[i] = (int *) malloc(3* sizeof(int));

	if (n==1) return mat;
	
	if (n%2 == 0){
		mat_ret = mat_pow(mat, n/2);
		mat_ret = mat_mult(mat_ret, mat_ret);
	}
	else{
		mat_ret = mat_pow(mat, (n-1)/2);
		mat_ret = mat_mult(mat_ret, mat_ret);
		mat_ret = mat_mult(mat_ret, mat);
	}

	return mat_ret;
}

void print_mat(int **mat)
{
	for(int i=0; i<3; i++){
		for(int j=0; j<3; j++)
			printf("%d ", mat[i][j]);
		printf("\n");
	}
}

void init_mat(int **mat)
{
	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++)
			mat[i][j]=0;

	mat[0][1] = 1;
	mat[1][2] = 1;
}

int main()
{
	freopen("iepuri.in", "r", stdin);
	freopen("iepuri.out", "w", stdout);

	int T;
	long n;
	int x, y, z, A, B, C, result;
	int **mat, **mat_rez ;

	mat =(int **) malloc(3* sizeof(int*));
	mat_rez =(int **) malloc(3* sizeof(int*));
	for(int i=0; i<3; i++){
		mat[i] = (int *) malloc(3* sizeof(int));
		mat_rez[i] = (int *) malloc(3* sizeof(int));
	}

	scanf("%d", &T);

	for(int i=0; i<T; i++){
		scanf("%d %d %d %d %d %d %d", &x, &y, &z, &A, &B, &C, &n);
		
		init_mat(mat);
		
		mat[2][0] = C;
		mat[2][1] = B;
		mat[2][2] = A;

		//print_mat(mat);
		//printf("\n----\n\n");
		
		mat = mat_pow(mat, n-2);
		//print_mat(mat);

		result = mat[2][0]*x + mat[2][1]*y + mat[2][2]*z ;
		printf("%d\n", result % 666013);
	}


	return 0;
}